python - 当名称前面有双下划线时,为什么传递关键字/命名参数会产生错误?
问题描述
在运行交易算法时,我遇到了以下问题,我尝试通过以下方式重现:
假设我有一个名为 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'
但是,当我从两种算法中的命名参数的前面删除“__”或两个下划线时,这个错误就会消失。有人可以向我解释为什么吗?
解决方案
请参阅有关名称修饰的文档:
Private name mangling:当在类定义中以文本形式出现的标识符以两个或多个下划线字符开头并且不以两个或多个下划线结尾时,它被认为是该类的私有名称。在为私有名称生成代码之前,私有名称会转换为更长的形式。转换插入类名,删除前导下划线并在名称前面插入一个下划线。例如,
__spam
出现在名为的类中的标识符Ham
将被转换为_Ham__spam
. 此转换与使用标识符的语法上下文无关。如果转换后的名称非常长(超过 255 个字符),则可能会发生实现定义的截断。如果类名仅包含下划线,则不进行任何转换。
这就解释了为什么。这个奇怪的特性首先存在的原因在本教程中进行了描述( TL;DR:这是一种避免名称与子类定义的名称冲突的技巧)。
解决方案很简单:在定义方法的参数时,不要使用带有两个前导下划线的名称。
推荐阅读
- powershell - 如何使用 PowerShell 排除 CSV 中的特定行?
- git - 为什么`git init`会破坏弹性beantalk部署?我怎样才能恢复?
- python - 为什么以下 for 循环在将元素值设置为整数时不起作用?为什么无法识别逻辑运算符“或”后的值?
- jquery - 如何添加 font-variant-numeric: tabular-nums; 到jQuery?
- javascript - 为什么最后一节涵盖了上述部分
- sql - 避免 SELECT 重复行上的 CASE
- java - 如何在 Java 中使用 Mac 上的“打开方式”获取文件?
- fortran - Fortran 90 中的数组、函数、变量和 size()
- binding - OpenHAB 缺少绑定
- visual-studio-code - Visual Studio Code 终端和 Linux 终端有什么区别?