Почему передача ключевого слова / именованных аргументов приводит к ошибке, когда перед именем стоит двойное подчеркивание? - PullRequest
3 голосов
/ 04 октября 2019

Во время работы торгового алгоритма я столкнулся со следующей проблемой, которую попытался воспроизвести следующим образом:

Предположим, у меня есть один алгоритм с именем 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'

Однако, когда я удаляю '__' или два подчеркивания в начале именованных аргументов в обоих алгоритмах, эта ошибка исчезает. Может кто-нибудь объяснить мне, почему?

1 Ответ

2 голосов
/ 04 октября 2019

См. Документацию о искажения имени :

искажение личного имени : когда идентификатор, который встречается в тексте в определении класса, начинается с двух или болеесимволы подчеркивания и не заканчиваются двумя или более символами подчеркивания, оно считается частным именем этого класса. Частные имена преобразуются в более длинную форму, прежде чем для них генерируется код. Преобразование вставляет имя класса с удаленными начальными подчеркиваниями и вставленным одиночным подчеркиванием перед именем. Например, идентификатор __spam в классе с именем Ham будет преобразован в _Ham__spam. Это преобразование не зависит от синтаксического контекста, в котором используется идентификатор. Если преобразованное имя очень длинное (длиннее 255 символов), может произойти усечение, определяемое реализацией. Если имя класса состоит только из подчеркиваний, преобразование не выполняется.

Это объясняет почему . Причина этой странной функции, существующей в первую очередь, описана в руководстве здесь (TL; DR: это хак, чтобы избежать столкновения имен с именами, определенными подклассами).

Решениеэто просто: не используйте имена с двумя ведущими подчеркиваниями при определении аргументов для методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...