如何解决“未解析的类属性引用”

问题描述

我一直在做一个小项目,它是一个网络爬虫模板。我在 pycharm 中遇到了一个问题,我收到了警告 Unresolved attribute reference 'domain' for class 'Scraper'

from abc import abstractmethod

import requests
import tldextract


class Scraper:
    scrapers = {}

    def __init_subclass__(scraper_class):
        Scraper.scrapers[scraper_class.domain] = scraper_class # Unresolved attribute reference 'domain' for class 'Scraper'

    @classmethod
    def for_url(cls,url):
        k = tldextract.extract(url)
        # Returns -> <scraper.SydsvenskanScraper object at 0x000001E94F135850> & Scraped BBC News<!DOCTYPE html><html Which type annotiation?
        return cls.scrapers[k.registered_domain](url)

    @abstractmethod
    def scrape(self):
        pass


class BBCScraper(Scraper):
    domain = 'bbc.co.uk'

    def __init__(self,url):
        self.url = url

    def scrape(self):
        rep = requests.Response = requests.get(self.url)
        return "Scraped BBC News" + rep.text[:20]  # ALL HTML CONTENT


class SydsvenskanScraper(Scraper):
    domain = 'sydsvenskan.se'

    def __init__(self,url):
        self.url = url

    def scrape(self):
        rep = requests.Response = requests.get(self.url)
        return "Scraped Sydsvenskan News" + rep.text[:20]  # ALL HTML CONTENT


if __name__ == "__main__":
    URLS = ['https://www.sydsvenskan.se/','https://www.bbc.co.uk/']
    for urls in URLS:
        get_product = Scraper.for_url(urls)
        r = get_product.scrape()
        print(r)

当然我可以忽略它,因为它正在工作,但我不喜欢忽略警告,因为我相信 pycharm 很聪明,应该解决警告而不是忽略它,我想知道它警告我的原因是什么?

解决方法

有几个不同的级别可以消除此警告:

  • 分配一个默认值:
class Scraper:
    scrapers = {}
    domain = None # Or a sensible value of one exists

  • 您可以添加或交替注释类型。
from typing import ClassVar

class Scraper:
    scrapers: ClassVar[dict[str,'Scraper']] = {}
    domain: ClassVar[str]

请注意,ClassVar 是必需的,否则将假定它们是实例属性。

,

告诉 yrou Scraper class 这个属性存在

class Scraper:
    scrapers = {}
    domain: str

    def __init_subclass__(scraper_class):
        Scraper.scrapers[scraper_class.domain] = scraper_class

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...