当名称前面有双下划线时,为什么传递关键字/命名参数会产生错误?

问题描述 投票:1回答:1

[在运行交易算法时,我遇到了以下问题,并尝试通过以下方式重现:

假设我有一种算法叫algo1.py,另一种算法叫algo2.py。

这里是algo2.py ...

class mathOperations():

    def __init__(self):
        self.value = 0

    def sum(self, __a = 0, __b = 0):
        return (__a + __b)

这里是algo1.py ...

from algo2 import mathOperations


math = mathOperations()
print(math.sum(__a = 56, __b = 44))

运行algo1.py时,出现以下消息:

Traceback (most recent call last):
  File "algo1.py", line 5, in <module>
    print(math.sum(__a = 56, __b = 67))
TypeError: sum() got an unexpected keyword argument '__a'

但是,当我在两种算法中都从命名参数的开头删除'__'或两个下划线时,此错误就会消失。有人可以向我解释原因吗?

python parameter-passing typeerror keyword-argument
1个回答
2
投票

请参阅有关name mangling的文档:

私有名称修改:当在类定义中以文本形式出现的标识符以两个或多个下划线字符开头且不以两个或多个下划线结尾时,则视为该类的私有名称。在为专用名称生成代码之前,专用名称会转换为更长的格式。转换将在类名前面插入类名,并删除前导下划线,并插入单个下划线。例如,出现在名为__spam的类中的标识符Ham将转换为_Ham__spam。此转换独立于使用标识符的句法上下文。如果转换后的名称过长(超过255个字符),则可能会发生实现定义的截断。如果类名仅包含下划线,则不进行任何转换。

这解释了为什么。教程here(TL; DR:避免与子类定义的名称发生名称冲突是一种h​​ack),首先说明了存在此怪异功能的原因。

解决方案很简单:在定义方法的参数时,不要在名称前使用两个下划线。

© www.soinside.com 2019 - 2024. All rights reserved.