问题标签 [python-typing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 如何在不明确列出类型的情况下确保参数具有相同的类型?
让我们假设我们需要一个函数,只要两个参数具有相同的类型,它就可以接受任何类型的两个参数。您将如何使用 mypy 对其进行静态检查?
如果我们只需要该函数接受一些有限数量的已知类型,这很容易:
对于此代码,mypy 可以确保 to 的参数f
是两个int
s 或两个str
s 或两个 s 列表int
或两个返回的零参数函数int
。
但是如果我们事先不知道类型怎么办?如果我们需要类似于let f (a:'t) (b:'t) = ()
F# 和 OCaml 的东西怎么办?简单的写作T = TypeVar('T')
会使事情变得f(1, "2")
有效,这不是我们想要的。
python - 使用类作为其方法中参数的类型提示
我在下面包含的代码会引发以下错误:
在这一行:
为什么 PythonVector2
在方法中无法识别我的类Translate
?
python - 如何注释多个返回值的类型?
如何使用类型提示来注释一个返回 an 的函数,该函数Iterable
总是产生两个值: abool
和 a str
?提示Tuple[bool, str]
很接近,除了它将返回值类型限制为元组,而不是生成器或其他类型的可迭代。
我很好奇,因为我想注释一个foo()
用于返回多个值的函数,如下所示:
通常像foo()
做类似return a, b
(返回元组)的函数,但我希望类型提示足够灵活,可以用生成器或列表或其他东西替换返回的元组。
python - Pandas 的 Mypy/typeshed 存根
只是检查是否有人已经为“pandas”生成了一组可工作的 mypy/typeshed 存根。我天真地在本地 pandas 安装上运行了 stubgen,它产生了一些错误。我可以从我必须开始的事情开始,但希望其他人把球推得更远。(在 GitHub 上没有什么明显的发现,尽管存根有一张旧票。)
python - 如何在 python 3.6 中使用类型提示?
我注意到 Python 3.5 和 Python 3.6 添加了很多关于静态类型检查的功能,所以我尝试了以下代码(在 python 3.6 中,稳定版)。
令我惊讶的是,Python 并没有给我一个错误或警告,尽管它1
被附加到list
应该只包含字符串的 a 中。Pycharm
检测到类型错误并给了我一个警告,但它并不明显并且没有显示在输出控制台中,我担心有时我可能会错过它。我想要以下效果:
- 如果很明显我使用了错误的类型,如上所示,抛出警告或错误。
- 如果编译器无法可靠地检查我使用的类型是对还是错,请忽略它。
那可能吗?也许mypy
可以做到,但我更喜欢使用 Python-3.6 风格的类型检查(like a: List[str]
)而# type List[str]
不是mypy
. 而且我很好奇本机python 3.6中是否有一个开关来实现我上面所说的两点。
python - 如何注释作为类对象(而不是类实例)的类型?
注释需要类对象而不是该类实例的函数参数的正确方法是什么?
在下面的示例中,some_class
argument 应该是一个类型实例(它是一个类),但这里的问题是它type
太宽泛了:
在some_class
需要一组特定类型对象的情况下,使用type
根本没有帮助。该typing
模块可能需要一个类泛型来执行此操作:
在上面的示例中,是some_class
或类,而不是它的实例。它们在类树中的位置应该无关紧要,因为它也应该是一个有效的案例。所以,Foo
Bar
Faz
some_class: Class[Foo]
或者
或者
对 mypy、pytype、PyCharm 等应该没问题。
如何使用当前的实现(Python 3.6 或更早版本)来做到这一点?
python - 如何在 for 循环中注释类型?
我想在for
-loop 中注释变量的类型。我试过了,但没有用:
我期望在 PyCharm 2016.3.2 中使用自动完成功能,但使用预注释不起作用:
PS 预注释适用于 PyCharm >= 2017.1。
python - Python 3.5 类型化的 NamedTuple 语法产生 SyntaxError
SyntaxError: invalid syntax
尝试新的类型化namedtuple
语法时出现错误:
在 Python 3.5.2 中,即使根据文档它应该从 3.5+ 开始有效。我错过了什么吗?我已经NamedTuple
从typing
代码中导入。
python - Python:argparse.Namespace 对象的类型提示
有没有办法让 Python 静态分析器(例如在 PyCharm 中,其他 IDE 中)在对象上的 Typehints 上进行检测argparse.Namespace
?例子:
如果我删除内联注释中的类型声明,PyCharm 不会抱怨,但它也不会拾取无效属性。例如:
有任何想法吗?
更新
受奥斯汀下面回答的启发,我能找到的最简单的解决方案是使用namedtuples
:
虽然这是令人满意的,但我仍然不喜欢重复参数名称。如果参数列表显着增长,更新两个位置将是乏味的。理想的方法是以某种方式从对象中提取参数,parser
如下所示:
我无法在argparse
模块中找到任何可以使这成为可能的东西,而且我仍然不确定是否有任何静态分析工具可以足够聪明地获得这些值并且不会使 IDE 陷入停顿。
仍在搜索中...
更新 2
根据 hpaulj 的评论,我能找到的最接近上述方法的“神奇地”提取已解析对象的属性的方法是dest
从每个解析器的_action
s 中提取属性:
但这仍然不会导致属性错误在静态分析中被标记。如果我通过电话,这也是正确namespace=MagicNamespace
的parser.parse_args
。
python - Python 3.6 中的类型提示生成器
根据PEP-484,我们应该能够键入提示生成器函数,如下所示:
但是,列表推导在 PyCharm 中给出了以下错误。
预期的 'collections.Iterable',得到了 'Generator[int, None, None]' 而不是 ... (⌘F1)
知道为什么 PyCharm 将其视为错误吗?
阅读一些答案后进行一些澄清。我正在使用 PyCharm Community Edition 2016.3.2(最新版本)并已导入typing.Generator
(在代码中更新)。上面的代码运行得很好,但是 PyCharm 认为这是一个错误:
所以,我想知道这实际上是一个错误还是 PyCharm 中不受支持的功能。