PD7*_*PD7 5 python pycharm python-3.x python-typing
在慢慢掌握与 PyCharm 协作打字的窍门后,我发现自己经常使用该包。我喜欢它的灵活性以及它如何适应几乎任何用例。
在使用这个包时(也因为它非常有用),我考虑为str从数据库获取的某些 id 创建一个“包装类型”,并在整个项目中用作字典键。
这样,如果函数使用直接从数据库获取的 id 作为键来传递字典,则类型提示不仅会提示所需的类型,还会提供有关数据流和键结构的一些信息(如果不仅仅是一个),而是使用两个或多个数据库 ID 来组成字典键。
我认为选择的工具是NewType,因为它实际上创建了一个新类型,其名称可以在 PyCharms 工具提示中显示(与TypeAlias或只是不同PrimaryKey = str)。然而,正如文档中预测的那样,PyCharm 的静态类型检查器不接受创建的NewTypeasstr并引发类型警告。
"Expect '{NewType xy}' got 'str' instead".
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:有什么办法解决这个问题吗?
"Expect '{NewType xy}' got 'str' instead".
Run Code Online (Sandbox Code Playgroud)
在我目前参与的项目中,这将是可读性的巨大改进,因为整个事情正在收集不同细节级别的内容,每个级别都由数据库主键标识。但如果我不能让它与 PyCharm 一起工作,我认为这是不值得的。
主要目标NewType是帮助检测逻辑错误,例如没有传递PrimaryKey您应该传递的内容。所以我认为最好的方法就是你最后的表现。
some_info[PrimaryKeyA('AKey_01'), PrimaryKeyB('BKey_01')] = 'example_data'
Run Code Online (Sandbox Code Playgroud)
您可以做的一件事是在程序中之前定义这些字符串。
key_1 = PrimaryKeyA('AKey_01')
key_2 = PrimaryKeyB('BKey_01')
some_info[key_1, key_2]
Run Code Online (Sandbox Code Playgroud)
或者根据上下文将它们作为函数的参数。因为这应该有效:
def foo(key_1: PrimaryKeyA, key_2: PrimaryKeyB) -> None:
some_info[key_1, key_2] = 'example_data'
Run Code Online (Sandbox Code Playgroud)
因为它实际上创建了一个具有名称的新类型
最后我只想指出这实际上是不正确的,至少在运行时不正确。类型检查器会将其视为新类型,是的,但在运行时它只返回给定的任何内容。
In [1]: from typing import NewType
In [2]: A = NewType("A", int)
In [3]: A("abc")
Out[3]: 'abc'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
283 次 |
| 最近记录: |