Augmented assignments
Не, не става въпрос за някаква cyberpunk версия на присвояванията. Ами за доброто старо i += 3
.
Резултата от изпълнението на долния код ще ви обърка малко.
t = ([], [])
try:
t[0] += [5]
except TypeError as err:
print("Type error: %s" % err)
# Prints "Type error: 'tuple' object does not support item assignment"
print(t) # will be ([5], [])
Ако още не ви е объркал, ще го напиша в думички. Получаваме exception
, че това което се опитваме да направим не е позволено и едновременно с това то някак се случва. Това вече трябва да ви подсказва, че ще се говори за дълбоките води на езика и може би вече ви се иска да беше cyberpunk версия на присвояването или някоя друга лоша шега.
Причината за всичкото това е подхода, който е избран за имплементиране на PEP203. Най - доброто обсяснение на проблема, което вероятно ще намерите е във FAQ страницата на езика.
Но нека и ние опитаме. На кратко:
-
+=
всъщност вика магическия метод__iadd__
- Горния код всъщност се превежда до нещо много приличащо на:
t = ([], []) try: result = t[0].__iadd__([5]) # which succeeds t[0] = result # which fails except TypeError as err: ...
Така листа, който се съдържа в първия елемент на двойката е променен, но присвояването му отново в двойката е предизвикало изключението.