Добавление нового свойства в экземпляр namedTuple в python и преобразование в dict

Я пытаюсь добавить новое свойство в именованный кортеж, в котором я хочу сохранить некоторые значения. Сообщите, что я хочу преобразовать его обратно в JSON, чтобы передать его в качестве параметра в API. Я нашел ответ, чтобы добавить свойство в namedTuple, однако он создает тип и не изменяет сам экземпляр. Каков наилучший способ достижения вышеуказанной функциональности.

как добавить поля в namedtuple?

def _json_object_hook(d): 
    return namedtuple('X', d.keys())(*d.values())
def json2obj(data):
    return json.loads(data, object_hook=_json_object_hook)

def lambda_handler(event, context):
    registrationResponse = s3.get_object(Bucket=bucket, Key=registrationkey)
    registrationResponse = registrationResponse['Body'].read().decode('utf-8')
    registration = json2obj(registrationResponse)   
    abc = namedtuple('registration',registration._fields+('point',))
    y = abc._asdict()  # TypeError: _asdict() missing 1 required positional argument: 'self'

В отладчике

type(abc) #<class 'type'>
type(registration) #<class '__main__.X'>    
registration #<X, len() = 7>    
abc #<class '__main__.registration'>

person Shantanu Gupta    schedule 06.08.2020    source источник


Ответы (1)


namedtuple не создает namedtuple. Он создает класс, который вы должны затем создать:

Record = namedtuple('Record', "a b")

Если у вас есть данные в диктофоне, например,

d1 = dict(a=1, b=2)

Вы можете создать аналогичную запись из него с помощью:

r1 = Record(**d1)

Не изменяйте поля namedtuple, потому что, как и кортежи, они должны быть неизменяемыми.

В качестве альтернативы добавления/изменения ключей словаря создайте новый класс Record на основе его ключей и создайте экземпляр namedtuple из словаря для доступа через имена полей.

person progmatico    schedule 12.11.2020