我想为动态生成的对象属性添加Python 3.5类型提示,以便IDE正确地自动完成它们。这里由"动力"我的意思是在创建类或__init__
或任何其他方法时,该属性不存在。
E.g。有没有办法通过评论或其他技巧添加这些?如果不是,我可以回退添加虚拟类属性。
实施例::
class Request:
"""Example HTTP request object.
We have `get_user()` but we do not declare it anyhere.
"""
...
# Pyramid's way of plugging in methods and properties to request, enabled addon capabilities for the framework
# adds Request.user - done in different part of application lifecycle, not during class creation
config.add_request_method(auth.get_user, 'user', reify=True)
目标是让这项工作能够让PyCharm和其他IDE完成这个属性。
答案 0 :(得分:3)
我将真正的类
我在班级中添加了假TCEFORM {
pages {
author.label = Teaser
}
}
方法
我使用此类而不是真实类作为参数类型提示
__type_hinting__
答案 1 :(得分:2)
在Python 3.6+中,您可以使用类级别类型提示 - 这些不会在类中生成属性。即。
class Request(_Request):
user: Optional[User]
这不会在类中创建属性,只会创建注释。
>>> Request.user
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: type object 'Request' has no attribute 'user'
>>> Request.__annotations__
{'user': typing.Union[foo.User, NoneType]}
在Python 3.5中,可以创建一个返回非数据描述符的函数(即描述符不带 __set__
);这可以通过实例属性覆盖,但它带有一些最小的运行时开销 - 描述符将从__dict__
获取并检查它是否定义了__set__
插槽 - 即使对于所有读物。它可能看起来像
class Request(_Request):
user = typed(User)
typed
定义为
def typed(type: Type[T]) -> T:
... return a dummy non-data-descriptor...
这应该足以让PyCharm正确地推断出类型。