2017-10-21 2 views
1

Ich bin auf der Suche nach einer Struktur wie Datenstruktur Ich kann mehrere Instanzen erstellen und einige Typenhinweis haben, ohne unveränderlich zu sein.Python veränderbar NamedTuple

So habe ich so etwas wie diese:

class ConnectionConfig(NamedTuple): 
    name: str 
    url: str 
    port: int 
    user: str = "" 
    pwd: str = "" 
    client: Any = None 

Aber ich mag es wandelbar haben. Ich kann es so tun:

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 

Aber der Mensch ... das ist hässlich:/Gibt es Einbau-Alternativen in Python? (Unter Verwendung von Python 3.6.3)

+0

Können Sie '* args' und' ** Kwargs'? –

+0

aber dann kann ich Typhinweis nicht mehr richtig benutzen? – Jodo

+0

Sie könnten '** kwargs' und eine (' for') Schleife verwenden. Und Sie könnten 'eval' (oder' exec') für diesen verwenden. Ich bin mir da nicht sicher, denn jedes Mal, wenn ich eval für die Zuweisung von Variablen verwende, wird ein Fehler ausgegeben. –

Antwort

2

Ihre Implementierung ist die ganz (nur) integrierte Möglichkeit, es zu tun, eigentlich:

class ConnectionConfig(): 
    def __init__(self, name: str, url: str, port: int, user: str = "", 
       pwd: str = "", client: Any = None): 
     pass 

Lese PEP 0484 Ich habe keine anderen Alternativen gefunden, die Ihren Bedürfnissen entsprechen. Fortsetzung der PEP-Kette, ich denke, dieses Zitat von PEP 20 The Zen of Python erklärt es:

Es sollte eine - und vorzugsweise nur eine - offensichtliche Möglichkeit, es zu tun.

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

dann können Sie alles im Konstruktor angeben

c=ConnectionConfig(port=22) 

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

Ich habe das schon mal probiert. Aber die Typhinweise funktionieren nicht so. Ich habe das in meiner Frage vielleicht nicht gut genug angegeben. – Jodo

+1

Die Typhinweise funktionieren nicht, weil sie nicht im __init__ – viddik13

-1

Wie wäre es recordclass mit (recordclass installieren PIP)?

from recordclass import recordclass 


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

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

Es ist (fast) die gleiche api wie namedtuple und es ist wandelbar

+0

sind. Ich würde es vorziehen, dass etw eingebaut wird. Trotzdem sehe ich auch nicht, wie Typhinweis verwendet werden kann. – Jodo

+0

Sind Sie sicher, dass dies nicht mit Ihrer IDE funktioniert? ipython weiß, mit recordclass – maor10

+0

automatisch zu vervollständigen Ich habe nie gesagt, dass es nicht funktioniert. Aber wieder, wie kann ich Typhinweise mit recordclass verwenden. Wie ich es sehe, funktioniert das nicht. – Jodo

0

Calling "_asdict()" auf die Schaffung des NamedTuple wird es zu einem OrderedDict() zu transformieren, aber eigentlich gar nicht befriedigen ...

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')]) 
Verwandte Themen