2017-10-21 143 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')])