如何解决如何注释现有对象的变量? 与mypy合作
def get_source(import_name: str) -> Optional[str]:
spec = get_spec(import_name)
# Now,here. The spec.loader might be one of several values.
# But I *know* that it is gonna be importlib.machinery.SourceFileloader
# I need to typecast the attribute of the spec.loader into the above
if spec and spec.loader.path.endswith('.py'):
return spec.loader.get_data(spec.loader.path).decode("utf-8")
return None
def get_spec(import_name: str) -> importlib.machinery.ModuleSpec:
try:
return importlib.util.find_spec(import_name)
except (ImportError,AttributeError,TypeError,ValueError):
return None
显然,PEP526允许我尝试使用可想象的最基本语法
obj.attr: annotation
但是,据我从Rossum's comment得知,显然类型检查器不必支持此语法。并且mypy给出错误Type cannot be declared in assignment to non-self attribute
。
现在,根据我在github上的shedshed上发现的另一个问题,您可以执行断言以让mypy知道对象的类型。而不是打字。
assert isinstance(obj.attr,annotation)
但是,对我来说,这感觉不对。我正在尝试使用打字功能(如果可能的话),并且我尝试提供的项目将mypy用作其类型检查器。
有效但使我讨厌自己的断言版本是:
def get_source(import_name: str) -> Optional[str]:
spec = get_spec(import_name)
assert isinstance(spec.loader,importlib.machinery.SourceFileLoader)
assert isinstance(spec.loader.path,str)
if spec and spec.loader.path.endswith('.py'):
return spec.loader.get_data(spec.loader.path).decode("utf-8")
return None
我读过的无数排版和Mypy问题无济于事,所以我在这里。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。