2017-10-21 91 views
1

我正在寻找一个像数据结构的结构我可以创建多个实例,并且有一些类型的提示而不是不可变的。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)

+0

您可以用'* args'和' ** kwargs'? –

+0

但我不能再使用类型暗示了吗? – Jodo

+0

你可以使用'** kwargs'和('for')循环。你可以使用'eval'(或'exec')作为这个。我只是不确定,因为每次我使用eval分配变量时,它会引发错误。 –

回答

2

你的实现是相当的(只)内置的方式做到这一点,实际上是:

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这个报价解释它:

应该有一个 - 最好只有一个 - 明显的方法来做到这一点。

0
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 
+0

我其实已经尝试过那个。但是类型提示并不是那种方式。我可能没有在我的问题中详细说明。 – Jodo

+1

类型提示将不起作用,因为它们不在__init__ – viddik13

-1

如何使用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和它的可变

+0

我宁愿内置。但是,我也看不到如何使用类型提示。 – Jodo

+0

您确定这不适用于您的IDE吗? ipython知道自动完成与记录类 – maor10

+0

我从来没有说过它不工作。但是,我又如何使用recordclass的类型提示。正如我所看到的那样,这是行不通的。 – Jodo

0

调用 “_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')])