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

问题描述

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

假设我有一个名为 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'

但是,当我从两种算法中的命名参数的前面删除“__”或两个下划线时,这个错误就会消失。有人可以向我解释为什么吗?

标签: pythonparameter-passingtypeerrorkeyword-argument

解决方案


请参阅有关名称修饰的文档:

Private name mangling:当在类定义中以文本形式出现的标识符以两个或多个下划线字符开头并且不以两个或多个下划线结尾时,它被认为是该类的私有名称。在为私有名称生成代码之前,私有名称会转换为更长的形式。转换插入类名,删除前导下划线并在名称前面插入一个下划线。例如,__spam出现在名为的类中的标识符Ham将被转换为_Ham__spam. 此转换与使用标识符的语法上下文无关。如果转换后的名称非常长(超过 255 个字符),则可能会发生实现定义的截断。如果类名仅包含下划线,则不进行任何转换。

这就解释了为什么。这个奇怪的特性首先存在的原因在本教程中进行了描述 TL;DR:这是一种避免名称与子类定义的名称冲突的技巧)。

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


推荐阅读