gpt4 book ai didi

python - 使用 Typing.NewType 时避免 PyCharm 类型警告

转载 作者:行者123 更新时间:2023-12-03 20:53:33 28 4
gpt4 key购买 nike

在慢慢掌握 typing 的窍门后通过与 PyCharm 合作,我发现自己经常使用该软件包。我喜欢它的灵活性以及它如何适应几乎所有用例。

在玩这个包的时候(也因为它真的很有用),我想为某些 str 创建一个“包装器类型” ids 我从数据库中获取并在整个项目中用作字典键。

这样,如果函数使用直接从数据库中获取的 id 作为键来传递字典,则类型提示不仅会提示所需的类型,还会提供有关数据流和键结构的一些信息,如果不仅如此,使用了两个或多个数据库 ID 来组成字典键。

我认为选择的设施是 NewType ,因为它实际上创建了一个新类型,其名称可以显示在 PyCharms 工具提示中(与 TypeAlias 或仅 PrimaryKey = str 不同)。然而,正如 documentation 中预测的那样, PyCharm 的静态类型检查器不接受创建的 NewTypestr并引发类型警告。

"Expect '{NewType xy}' got 'str' instead".

所以我的问题是:有没有办法解决这个问题?

# instead of:
some_info: Mapping[Tuple[str, str], List[Any]] = dict() # obviously works

# it'd look like this:
PrimaryKeyA = NewType('PrimaryKeyA', str)
PrimaryKeyB = NewType('PrimaryKeyB', str)

some_info: Mapping[Tuple[PrimaryKeyA, PrimaryKeyB], List[Any]] = dict()

some_info['AKey_01', 'BKey_01'] = 'example_data' # raises type warning

# I could do:
some_info[PrimaryKeyA('AKey_01'), PrimaryKeyB('BKey_01')] = 'example_data'
# But that doesn't feel more readable

在我目前参与的项目中,这将是可读性的巨大改进,因为整个过程是收集不同细节级别的内容,每个级别由数据库主键标识。但是如果我不能让它与 PyCharm 一起工作,我认为这不值得麻烦。

最佳答案

NewType的主要目标是为了帮助检测逻辑错误,比如不传入 PrimaryKey你应该。所以我认为最好的方法是你最后展示的方式。

some_info[PrimaryKeyA('AKey_01'), PrimaryKeyB('BKey_01')] = 'example_data'
您可以做的一件事是在程序之前定义这些字符串。
key_1 = PrimaryKeyA('AKey_01')
key_2 = PrimaryKeyB('BKey_01')

some_info[key_1, key_2]
或者根据上下文将它们作为函数的参数。因为这应该有效:
def foo(key_1: PrimaryKeyA, key_2: PrimaryKeyB) -> None:
some_info[key_1, key_2] = 'example_data'
实际上不是运行时的新类型

since it actually creates a new type with a name


最后我只想指出这实际上是不正确的,至少在运行时不是。类型检查器会将其视为新类型是的,但在运行时它只返回给它的任何内容。
In [1]: from typing import NewType             

In [2]: A = NewType("A", int)

In [3]: A("abc")
Out[3]: 'abc'

关于python - 使用 Typing.NewType 时避免 PyCharm 类型警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61893313/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com