Python mutable NamedTuple
问题描述:
我正在寻找一个像数据结构的结构我可以创建多个实例,并且有一些类型的提示而不是不可变的。Python mutable NamedTuple
所以我有这样的事情:
class ConnectionConfig(NamedTuple):
name: str
url: str
port: int
user: str = ""
pwd: str = ""
client: Any = None
但我想有它可变的。我可以这样做:
class ConnectionConfig():
def __init__(self, name: str, url: str, port: int, user: str = "", pwd: str = "", client: Any = None):
self.name = name
self.url = url
self.port = port
self.user = user
self.pwd = pwd
self.client = client
但是,男人......这是丑陋的:/有没有在python内置的替代品? (使用Python 3.6.3)
答
你的实现是相当的(只)内置的方式做到这一点,实际上是:
class ConnectionConfig():
def __init__(self, name: str, url: str, port: int, user: str = "",
pwd: str = "", client: Any = None):
pass
阅读PEP 0484我还没有找到符合您需求的其他替代方案。继续PEP链,我想从PEP 20 The Zen of Python这个报价解释它:
应该有一个 - 最好只有一个 - 明显的方法来做到这一点。
答
class ConnectionConfig():
name: str
url: str
port: int
user: str = ""
pwd: str = ""
client: Any = None
def __init__(self, **kv):
self.__dict__.update(kv)
,那么你可以在构造
c=ConnectionConfig(port=22)
print (c.port) # will print 22
答
如何使用recordclass(PIP安装recordclass)指定的一切吗?
from recordclass import recordclass
>>> Point = recordclass('Point', 'x y')
>>> p = Point(3, 2)
>>> p
Point(x=3, y=2)
>>> p.x = 8
这是(几乎)相同的API namedtuple和它的可变
答
调用 “_asdict()” 关于创建NamedTuple将其转换为一个OrderedDict(),但并没有真正满足在所有...
from typing import NamedTuple
class ConnectionConfig(NamedTuple):
name: str
url: str
port: int
user: str = ""
pwd: str = ""
mutable_connection_cfg = ConnectionConfig("my_name", "my_url", 111, "my_user", "my_pwd")._asdict()
print(mutable_connection_cfg)
>> OrderedDict([('name', 'my_name'), ('url', 'my_url'), ('port', 111), ('user', 'my_user'), ('pwd', 'my_pwd')])
您可以用'* args'和' ** kwargs'? –
但我不能再使用类型暗示了吗? – Jodo
你可以使用'** kwargs'和('for')循环。你可以使用'eval'(或'exec')作为这个。我只是不确定,因为每次我使用eval分配变量时,它会引发错误。 –