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: ...

Така листа, който се съдържа в първия елемент на двойката е променен, но присвояването му отново в двойката е предизвикало изключението.