Ответ 1
Мелодия имени применяется ко всем идентификаторам с ведущими двойными символами подчеркивания независимо от того, где они происходят (от второго до последнего предложения в этом разделе):
Это преобразование не зависит от синтаксического контекста, в котором используется идентификатор.
Это проще реализовать, определить и более согласованно. Это может показаться глупым, но всякое изъявление названия - уродливый маленький взлом ИМХО; и вы не собираетесь использовать такие имена для чего-либо, кроме атрибутов/методов, в любом случае.
Spam().egg(_Spam__a=1)
, а также Spam().egg(1)
, работает. Но даже если вы можете заставить его работать, подчеркивание подчеркивания (любое число из них) не имеет места в именах параметров. Или в любой локальной переменной (исключение: _
), если на то пошло.
Изменить: Вы, кажется, нашли угловой случай, который никто никогда не рассматривал. Документация здесь неточна, или реализация является ошибочной. Похоже, что имена аргументов ключевого слова не искажены. Посмотрите на байт-код (Python 3.2):
>>> dis.dis(Spam.egg)
3 0 LOAD_FAST 0 (self)
3 LOAD_ATTR 0 (_egg)
6 LOAD_CONST 1 ('__a') # keyword argument not mangled
9 LOAD_FAST 1 (a)
12 CALL_FUNCTION 256
15 RETURN_VALUE
>>> dis.dis(Spam._egg)
2 0 LOAD_FAST 1 (_Spam__a) # parameter mangled
3 RETURN_VALUE
Это может быть связано с тем, что аргументы ключевого слова эквивалентны передаче dict (в данном случае {'__a': 1}
), ключи которого тоже не будут искажены. Но, честно говоря, я бы назвал это уродливым угловым делом в уже уродливом частном случае и продолжил. Это не важно, потому что вы все равно не должны использовать такие идентификаторы.