2017-10-21 4 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?

+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からのこの引用文がそれを説明していると思います。

それを行うには1つの方法が必要です。 OrderedDict()に変換されますNamedTupleの作成時に "_asdictを()" を呼び出すが、実際には全く満足していない

0
class ConnectionConfig(): 
    name: str 
    url: str 
    port: int 
    user: str = "" 
    pwd: str = "" 
    client: Any = None 
    def __init__(self, **kv): 
     self.__dict__.update(kv) 

を(Pythonの3.6.3を使用して)あなたは、コンストラクタ

c=ConnectionConfig(port=22) 

print (c.port) # will print 22 
+0

私は実際に前にすでにそれを試しました。しかし、タイプヒントはそのように動作していません。私は多分私の質問で十分にそれを指定していない。 – Jodo

+1

タイプヒントは、__init__ – viddik13

-1

どうrecordclass(recordclassをインストールピップ)を使用してについてのすべてを指定することができますか?

from recordclass import recordclass 


>>> Point = recordclass('Point', 'x y') 

>>> p = Point(3, 2) 
>>> p 
Point(x=3, y=2) 
>>> p.x = 8 

それは(ほぼ)namedtupleと同じAPIと、それは変更可能です

+0

にはないので動作しません。sthが組み込まれているほうがいいですが、タイプヒントをどのように使用できるかもわかりません。 – Jodo

+0

これはあなたのIDEではうまくいきませんか? ipythonはレコードクラスのオートコンプリートを知っています – maor10

+0

私はそれがうまくいかないとは言いませんでした。しかし、もう一度、どのようにレコードクラスで型ヒントを使うことができますか?私が見ているように、それはうまくいかない。 – Jodo

0

...

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')]) 
関連する問題