Python: Используя namedtuple. _ заменяют переменной как имя поля

Действительно ли я могу сослаться на namedtuple fieldame использование переменной?

from collections import namedtuple
import random 

Prize = namedtuple("Prize", ["left", "right"]) 

this_prize = Prize("FirstPrize", "SecondPrize")

if random.random() > .5:
    choice = "left"
else:
    choice = "right"

#retrieve the value of "left" or "right" depending on the choice

print "You won", getattr(this_prize,choice)

#replace the value of "left" or "right" depending on the choice

this_prize._replace(choice  = "Yay") #this doesn't work

print this_prize
7
задан Peter Stewart 28 January 2010 в 20:02
поделиться

2 ответа

Кортежи являются непреложными, так же как и NamedTuples. Они не должны быть изменены!

this_prize._replace(choice = "Yay") вызывает _replace с аргументом ключевого слова "choice". Он не использует choice в качестве переменной и пытается заменить поле на имя choice.

this_prize._replace(**{выбор: "Yay"} ) будет использовать любой выбор, так как имя поля

_replace возвращает новый NamedTuple. Вам нужно переименовать его: this_prize = this_prize._replace(**{выбор: "Yay"} )

Просто используйте dict или напишите вместо него обычный класс!

14
ответ дан 6 December 2019 в 12:50
поделиться
>>> choice = 'left'
>>> this_prize._replace(**{choice: 'Yay'})         # you need to assign this to this_prize if you want
Prize(left='Yay', right='SecondPrize')
>>> this_prize
Prize(left='FirstPrize', right='SecondPrize')         # doesn't modify this_prize in place
2
ответ дан 6 December 2019 в 12:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: