Mik*_*maa 9 python pycharm python-3.5
我想为动态生成的对象属性添加Python 3.5类型提示,以便IDE正确地自动完成它们.这里的"动态"是指在类创建期间或在__init__任何其他方法中不存在该属性.
例如,有没有办法通过评论或其他技巧添加这些?如果不是,我可以回退添加虚拟类属性.
例::
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)
Run Code Online (Sandbox Code Playgroud)
目标是使这项工作能够使PyCharm和其他IDE完成此属性.
在 Python 3.6+ 中,您可以使用类级别的类型提示 - 这些不会在类中生成属性。IE
class Request(_Request):
user: Optional[User]
Run Code Online (Sandbox Code Playgroud)
这不会在类中创建属性,只会创建注释。
>>> 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]}
Run Code Online (Sandbox Code Playgroud)
在 Python 3.5 中,可以创建一个返回非数据描述符(即没有 的描述符__set__)的函数;这将被实例属性覆盖,但它带来了一些最小的运行时开销——__dict__如果它定义了__set__插槽,将从描述符中获取并检查它——即使对于所有读取也是如此。然后它可能看起来像
class Request(_Request):
user = typed(User)
Run Code Online (Sandbox Code Playgroud)
其中typed定义为
def typed(type: Type[T]) -> T:
... return a dummy non-data-descriptor...
Run Code Online (Sandbox Code Playgroud)
这应该足以让 PyCharm 正确推断类型。
| 归档时间: |
|
| 查看次数: |
1453 次 |
| 最近记录: |