我有一个关于在python中输入的问题。
警告:这个问题不是__slots__ type annotations for Python / PyCharm
的重复,因为主题是关于实用程序,而不是一个pycharm问题,然而,正如你所看到的,它是我稍后提到的优点之一。
首先,我有一个类Collections
组我所有的收集从我的主数据库(mongo db数据库):
class Collections(StaticClassList):
"""A class to group all mongo collections from main database."""
__slots__: Tuple[str, ...] = (
"plugins", "prefixes", "reaction_roles", "welcome", "verify",
"chatbot", "chatbot", "permissions"
)
collections: Collections = Collections(database.axiol)
继承了这个类:
class StaticClassList(ABC):
__instances = set()
def __init__(self, base) -> None:
...
for attr_name in self.__slots__:
setattr(
self, attr_name,
base['_'.join(map(str.capitalize, attr_name.split()))]
)
...
快速注意:这个抽象类被多个类使用,__init__方法被减少到必要的最小值,这是两个...
我的问题是我是否应该添加这些类型注释如下:
. class Collections(StaticClassList):
. """A class to group all mongo collections from main database."""
. __slots__: Tuple[str, ...] = (
. "plugins", "prefixes", "reaction_roles", "welcome", "verify",
. "chatbot", "chatbot", "permissions"
. )
.
+ plugins: AsyncIOMotorCollection
+ prefixes: AsyncIOMotorCollection
+ reaction_roles: AsyncIOMotorCollection
+ welcome: AsyncIOMotorCollection
+ verify: AsyncIOMotorCollection
+ chatbot: AsyncIOMotorCollection
+ permissions: AsyncIOMotorCollection
.
这是一个很难显示这将添加什么
这些是我的专业&注释的缺点
pros
- 并不明显每个槽都是
AsyncIOMotorCollection
和"显式优于隐式。">(Python的Zen) - 它允许ide检测属性(否则没有注释,但这是一个巨大的交易吗?)
cons
它要求我从
motor.motor_asyncio
导入AsyncIOMotorCollection
,AsyncIOMotorCollection
未在__all__中声明它使类看起来更笨拙,我已经创建了
StaticClassList
来避免写这样的东西:# <Collections> plugins: AsyncIOMotorCollection = database.axiol["Plugins"] prefixes: AsyncIOMotorCollection = database.axiol["Prefixes"] reaction_roles: AsyncIOMotorCollection = database.axiol["Reaction Roles"] ...
我希望你能帮我解决这个审讯,祝大家今天愉快!
ichard26
的回答(不幸的是没有堆栈溢出帐户)
我会输入这些属性,这样我的IDE或其他工具就可以对使用这些属性的代码执行更有用的检查。
假设我有这样的代码:
# let's just assume this is an invalid operation
val = collections.welcome[1]
没有类型注释的mypy可能不会捕捉到这个问题,或者会抱怨一个有效的操作不是有效的因为这些属性的定义是动态的,所以它别无选择,只能假设它们为Any
- 它要求我从电机导入AsyncIOMotorCollection。没有在所有
中声明motor_asyncio和AsyncIOMotorCollection
这个可以通过from __future__ import annotations
+if typing.TYPE_CHECKING: from motor.motor_asyncio import AsyncIOMotorCollection.
来解决
- 它使类看起来更笨拙,我已经创建了StaticClassList来避免写这样的东西:
是的,没有办法解决这个问题,这是动态设置属性的代价。对我来说,工具是值得额外的行,但这是你的决定。
注释future标志使注释保持字符串形式,除非Python被特别要求,否则永远不会求值加上打字。TYPE_CHECKING常量(为False,但类型检查器假定为True)意味着导入实际上不存在(除了视觉上)。只有Python 3.7+的东西