Python:名称“from”作为参数抛出语法错误 [重复]

Python: Name "from" as parameter throws Syntax error [duplicate]

提问人:Ezachiel 提问时间:1/16/2023 最后编辑:Ezachiel 更新时间:1/16/2023 访问量:73

问:

我正在研究 API,我真的无法重命名变量名称以快速处理事情,但我无法运行代码(Python 3.11)。

问题:

def __init__(self, from: str = None)
    self.from = from

当我尝试运行这块写得很漂亮的宝石时,我遇到了一个错误。

def __init__(self, from: str = None
                   ^^^^
SyntaxError: invalid syntax

即使是 pylance 的语法也有问题,但我设法在脚本开头修复了它。# type: ignore

有什么建议吗?

编辑器:VSCode

我尝试过谷歌,但没有多大帮助。:)

python-3.x 语法错误

评论

3赞 Brian61354270 1/16/2023
from是保留关键字,不能用作标识符名称。时期。您唯一的选择是使用不同的签名(重命名参数,还是接受字典?
1赞 Brian61354270 1/16/2023
顺便说一句,严格来说是类型错误。 或者会更正确name: str = Nonename: Optional[str] = Nonename: str | None = None
0赞 Ezachiel 1/16/2023
谢谢布莱恩,你没有让我开心。谢谢
0赞 mtraceur 1/16/2023
@Brian我认为可以提出一个很好的论点,它非常清晰、符合人体工程学,而且不是特别容易出错,而冗余的样板会浪费更多的时间(包括,最重要的是,人们阅读代码的时间),而不是“是的,我真的是说这里允许的,这不是一个错误”的值。(换言之,可以提出一个很好的论据,即静态类型分析器应该在声明站点绝对接受等价于 。foo: SomeType = Nonefoo: SomeType | None = NoneNone= None| None = None
0赞 Ezachiel 1/16/2023
好的,我修复了名称,但我的递归看起来不像以前那么漂亮了 -moisturized

答:

2赞 ti7 1/16/2023 #1

错误消息不是很清楚,但是一个保留关键字from

https://docs.python.org/3/reference/lexical_analysis.html#keywords

    ...
except Exception as ex:
    raise ValueError("oops") from ex
def my_generator(some_iter):
    ...
    yield from some_iter
from foo import bar

如果你必须保留这个名字(比如说,前端一些其他冻结的 API),你可以从中提取它**kwargs

def __init__(self, *args, **kwargs):
    self._from = kwargs["from"]

您可能还必须小心创建类的实例

AwkwardFromArgClass(**{"from": "from value"})

评论

0赞 mtraceur 1/16/2023
替代参数名称而不是“from”的一个好做法是回答:这个参数代表/包含什么?例如,可以使用字符串 () 而不是作为参数名称的类。IPv4AddressIPv4('8.8.8.8')addressfrom
1赞 mtraceur 1/16/2023
当关键字确实是最好的单词时,PEP-8 建议附加一个后缀 _:“如果函数参数的名称与保留关键字冲突,通常最好附加一个尾随下划线,而不是使用缩写或拼写损坏。因此比 .(也许更好的方法是通过使用同义词来避免这种冲突。class_clss
0赞 ti7 1/16/2023
啊,对于这样的类来说有点宗教信仰,但我更喜欢这里的前缀,以帮助它更清楚地知道是内部成员(仍然避免)stackoverflow.com/questions/1301346。但实际上,像你建议的“地址”或“不要那样做”会好得多!也许最实际的是,像 using 这样的样式提供了一个很好的机会,可以选择性地接受旧值和新值(也许通过),注入警告,并最终希望过渡到一个更友好的名称!__fromSyntaxErrorkwargs["from"]KeyError
0赞 mtraceur 1/16/2023
是的,当它是私有属性时,它应该是一个前缀 - 引用的 PEP 8 后缀指南适用于公共参数(我会说公共属性等)。__
0赞 marick 1/16/2023 #2

您不能用作参数名称,因为这是用于导入模块的默认语法,例如仅导入 sin 函数。fromfrom math import sin

尝试使用 F2 重命名它from_