Обновите поле в классе данных с именем поля, известным только во время выполнения - PullRequest
0 голосов
/ 28 сентября 2018

Я хотел бы обновить поле в классе данных, но я знаю имя поля только во время выполнения, а не во время разработки.

#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-

from dataclasses import dataclass # I use the backport to 3.6

@dataclass
class Template:
    number: int = 0
    name: str = "^NAME^"


oneInstance = Template()
print(oneInstance) # Template(number=0, name='^NAME^')
# If I know the variable name during development, I can do this:
oneInstance.number=77
# I get this from a file during runtime:
para = {'name': 'Jones'}
mykey = 'name'
# Therefore, I used exec:
ExpToEval = "oneInstance." + mykey + ' = "' + para[mykey] + '"'
print (ExpToEval) # oneInstance.name = "Jones"
exec(ExpToEval)  # How can I do this in a more pythonic (and secure) way?
print(oneInstance) # Template(number=77, name='Jones')

Мне нужно что-то вроде

oneInstance[mykey] = para[mykey]

но это заканчивается в «Ошибка типа: объект« Шаблон »не поддерживает назначение элемента»

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

Вы можете использовать setattr для обновления атрибутов объекта во время выполнения:

oneInstance = Template()
setattr(oneInstance, 'name', 'Jones')  # this doesn't raise a TypeError
print(oneInstance.name)  # prints: 'Jones'
0 голосов
/ 28 октября 2018

Вы можете попробовать метод replace () , как показано ниже:

from dataclasses import dataclass, replace

@dataclass
class Template:
    number: int = 0
    name: str = "^NAME^"

oneInstance = Template()
print(oneInstance)
para = {'name': 'Jones'}
oneInstance = replace(oneInstance, **para)
print(oneInstance)

Это должно работать, если ваш dict para содержит только ключи, являющиеся полями вашего класса данных.

...