Python 如何解决;类“的未解析属性引用”;
我一直在从事一个小项目,这是一个网络爬虫模板。我在pycharm中遇到了一个问题,我得到了一个警告,类“Scraper”的未解析属性引用“domain”Python 如何解决;类“的未解析属性引用”;,python,python-3.x,class-attributes,Python,Python 3.x,Class Attributes,我一直在从事一个小项目,这是一个网络爬虫模板。我在pycharm中遇到了一个问题,我得到了一个警告,类“Scraper”的未解析属性引用“domain” from abc import abstractmethod import requests import tldextract class Scraper: scrapers = {} def __init_subclass__(scraper_class): Scraper.scrapers[scra
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)
来自abc导入抽象方法的
导入请求
进口tldextract
类别刮刀:
刮刀={}
定义初始子类(刮刀类):
Scraper.scrapers[Scraper_class.domain]=Scraper_class#类“Scraper”的未解析属性引用“domain”
@类方法
url(cls,url)的定义:
k=tldextract.extract(url)
#返回->&Scraped BBC News只需告诉yrouScraper
class这个属性存在
类刮刀:
刮刀={}
域名:str
定义初始子类(刮刀类):
Scraper.scrapers[Scraper\u class.domain]=Scraper\u类
只要告诉YRUScraper
类这个属性存在
类刮刀:
刮刀={}
域名:str
定义初始子类(刮刀类):
Scraper.scrapers[Scraper\u class.domain]=Scraper\u类
关于如何删除此警告,有几个不同的级别:
- 指定默认值:
- 您可以附加或交替地对类型进行注释
请注意,ClassVar
是必需的,因为否则将假定它们是实例属性。关于如何删除此警告,有几个不同的级别:
- 指定默认值:
- 您可以附加或交替地对类型进行注释
请注意,ClassVar
是必需的,因为否则将假定它们是实例属性。注意这里和其他:您可能会考虑奖励最有用的属性answer@azro很抱歉我没有像我想的那样接受答案,我是那个给出+1答案的人,哈哈!刚刚接受❤️注意:你可以考虑奖励最有用的人answer@azro很抱歉我没有像我想的那样接受答案,我是那个给出+1答案的人,哈哈!刚刚接受❤️老实说,这是一个糟糕的答案:拼写错误,没有充分解释问题,没有正确使用类型提示。老实说,这是一个糟糕的答案:拼写错误,没有充分解释问题,没有正确使用类型提示。哦,基本上是“修复”是在init子类之前声明属性吗?使用scrapers:ClassVar[dict[str,Scraper]]={}
>>>未解析引用“Scraper”
@gragornewbie抱歉。您需要为从uuu未来导入注释
或将刮板
放入字符串(如我编辑了答案)是否有理由使用其中一个而不是另一个?只是curious@ProtractorNewbiePython3.11不是喷气式飞机。下一个版本(3.10)将在几个月后发布<“来自未来”的“代码>导入注释”
是一种神奇的导入,可防止类型注释(例如,:
之后的大多数内容)不被评估。这意味着你可以“引用”一些东西,即使它当时并不存在。这里有一个更完整的解释:哦,那么基本上“修复”是在init子类之前声明属性?我在使用scrapers:ClassVar[dict[str,Scraper]]={}
>>>未解析的引用“Scraper”
@progratornewbie抱歉。您需要为从uuu未来导入注释
或将刮板
放入字符串(如我编辑了答案)是否有理由使用其中一个而不是另一个?只是curious@ProtractorNewbiePython3.11不是喷气式飞机。下一个版本(3.10)将在几个月后发布<“来自未来”的“代码>导入注释”是一种神奇的导入,可防止类型注释(例如,:
之后的大多数内容)不被评估。这意味着你可以“引用”一些东西,即使它当时并不存在。下面是一个更完整的解释:
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]