我正在寻找一种更Python化的方法来更新NamedTuple中的字段(通过键入)。 我在运行时从文本文件中获取了字段名称和值,因此使用了exec,但我相信,必须有更好的方法:
#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-
from typing import NamedTuple
class Template (NamedTuple):
number : int = 0
name : str = "^NAME^"
oneInstance = Template()
print(oneInstance)
# If I know the variable name during development, I can do this:
oneInstance = oneInstance._replace(number = 77)
# I get this from a file during runtime:
para = {'name' : 'Jones'}
mykey = 'name'
# Therefore, I used exec:
ExpToEval = "oneInstance = oneInstance._replace(" + mykey + " = para[mykey])"
exec(ExpToEval) # How can I do this in a more pythonic (and secure) way?
print(oneInstance)
我想从3.7开始,我可以使用数据类解决此问题,但我需要3.6版本的
答案 0 :(得分:0)
无论如何都不能在命名元组上使用_replace
。元组是不可变的。如果使用命名元组,其他开发人员将期望您不打算更改数据。
Python方法确实是dataclass。您也可以在 Python3.6 中使用数据类。只需使用dataclasses backport from PyPi。
然后整个过程变得真正易读,您可以使用getattr
和setattr
来轻松按名称寻址属性:
from dataclasses import dataclass
@dataclass
class Template:
number: int = 0
name: str = "^Name^"
t = Template()
# use setattr and getattr to access a property by a runtime-defined name
setattr(t, "name", "foo")
print(getattr(t, "name"))
这将导致
foo