Python:在同一行中声明多个变量的类型



如果重复,请告诉我,但我找不到答案。此外,这个问题似乎并没有解决这个问题。

我想在同一行中声明多个变量的类型。代替

a: float
b: float
c: float

我想用之类的东西

a, b, c: float

但是我有一个语法错误。正确的语法是什么?

似乎不可能用一条注释语句注释多个变量。

注释赋值语句将注释定义为:

annotated_assignment_stmt ::=  augtarget ":" expression
["=" (starred_expression | yield_expression)]

因此,augtarget规则规定了允许在冒号前面加什么。augtarget定义为:

augtarget                 ::=  identifier | attributeref | subscription | slicing

因此,唯一可以放在冒号之前的是标识符(即单个变量(、attributeref(后面跟着.some_attribute_name的表达式(、订阅(后面跟着[some_index]的表达式(或切片(与订阅的语法相同(。a, b, c不是这些东西中的任何一个,所以a, b, c: <some type>不是合法语法。


如果您只想在一行中注释所有三个变量,而不一定要在一条语句中注释,则可以用分号将独立的简单语句链接在一起:

a:float; b:float; c:float

但这有点不令人满意,因为您仍然需要键入float三次。

如果PEP484类型提示支持同一类型的多个声明作为一条语句,并且在展开元组时支持类型提示,那就太好了。

除此之外,当我想在一条语句中声明同一类型的多个变量时,我发现伪赋值作为一种变通方法很有用:

# Multiple type-declarations on same line, but not same statement:
a: List[int]; b: Tuple[float, ...]; c: Iterable[str]
# Multiple declarations of same type in same statement:
# noinspection PyUnusedLocal
k = l = m = n = 0  # type: int
# noinspection PyUnusedLocal
q = r = s = t = ''  # type: str
# noinspection PyUnusedLocal
x = y = z = w = 0.0  # type: float

说明:即使从未使用过初始的伪值(因为变量会被覆盖(,它们仍然可以确保这些变量被理解为具有最初给定的值的类型。(我还添加了老式的评论类型提示,以向人类读者明确其意图。但删除它们并没有什么区别。PyCharm仍然理解。(

我正在使用PyCharm 2021.2.1和Python 3.8。(PyCharm有自己的linter实现PEP484,与mypy分离。((此外,我今年夏天刚刚开始学习Python,所以这个答案可能会有所改进。(

a,b,c: float,float,float

将是正确的

您必须为所有变量分配所有值。

E.G:-
a,b,c = 1.0,2.0,3.0
a,b,c = 1.0,1.0,1.0

最新更新