我试图将一些函数屏蔽为属性(通过包装器,这在这里并不重要)并将它们动态添加到对象中,但是,我需要代码完成和 mypy 才能工作。
我想出了如何动态添加属性(通过元类或简单地在构造函数中),但我遇到的问题是 mypy 没有选择它(IDE 也没有)。
一种解决方法是定义具有相同名称/类型的属性,但我真的不喜欢这种方法(太多代码、静态属性集、重复)。
有没有更好的办法?
class Meta(type):
def __new__(cls, clsname, bases, dct):
def prop(self) -> int:
return 1
inst = super(Meta, cls).__new__(cls, clsname, bases, dct)
inst.dynprop=property(prop)
return inst
class Foo(metaclass=Meta):
dynprop=int #this works, but I don't want it
class Bar(metaclass=Meta):pass
def somefunc(s:str):
print(s)
foo=Foo()
bar=Bar()
somefunc(foo.dynprop) #this is ok
somefunc(bar.dynprop) #meta.py:24: error: "Bar" has no attribute "dynprop"
修复您的 IDE? :-)。在Python中总会存在静态分析无法进行的极端情况。在这种情况下,您获得的工具应该可以帮助您解决问题。
如果不运行代码,IDE 或 Mypy 就无法找到这些动态属性。我知道有一些 IDE,至少在过去,实际上是通过导入模块来实现自动完成的——但这也会引发一系列附带影响。
我想说,为了拥有动态代码,您将不得不在没有这些工具的情况下生活 - 甚至使用“不要检查此”标记样式添加注释。自动完成根本不可能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)