Python可变名称元组

Python可变名称元组,python,struct,python-3.6,mutable,namedtuple,Python,Struct,Python 3.6,Mutable,Namedtuple,我正在寻找一种类似于结构的数据结构,我可以从中创建多个实例,并具有某种类型暗示,而不会不可变 所以我有这样的想法: class ConnectionConfig(NamedTuple): name: str url: str port: int user: str = "" pwd: str = "" client: Any = None 但我希望它是可变的。我可以这样做: class ConnectionConfig(): def __

我正在寻找一种类似于结构的数据结构,我可以从中创建多个实例,并具有某种类型暗示,而不会不可变

所以我有这样的想法:

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():
    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
然后可以在构造函数中指定所有内容

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

它与namedtuple几乎相同,而且是可变的

使用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

它与namedtuple几乎相同,而且是可变的

实际上,您的实现是实现它的唯一内置方式:

class ConnectionConfig():
    def __init__(self, name: str, url: str, port: int, user: str = "",
                 pwd: str = "", client: Any = None):
        pass
在阅读中,我没有找到任何其他适合你需要的替代品。继续政治公众人物链,我想这句话解释了这一点:

应该有一种——最好只有一种——显而易见的方法来做到这一点


实际上,您的实现是实现此功能的唯一内置方式:

class ConnectionConfig():
    def __init__(self, name: str, url: str, port: int, user: str = "",
                 pwd: str = "", client: Any = None):
        pass
在阅读中,我没有找到任何其他适合你需要的替代品。继续政治公众人物链,我想这句话解释了这一点:

应该有一种——最好只有一种——显而易见的方法来做到这一点


在创建NamedTuple时调用asdict将把它转换为一个有序的dict,但一点也不令人满意

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

在创建NamedTuple时调用asdict将把它转换为一个有序的dict,但一点也不令人满意

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吗?但是我不能再使用类型暗示了,对吗?你可以使用**kwargs和for循环。你可以用eval或exec来做这个。我只是不确定这一点,因为每次我使用eval分配变量时,它都会抛出一个错误。你可以使用*args和**kwargs吗?但是我不能再使用类型暗示了,对吧?你可以使用**kwargs和for循环。你可以用eval或exec来做这个。我只是不确定这一点,因为每次我使用eval分配变量时,它都会抛出一个错误。实际上我以前已经试过了。但是类型提示不是这样工作的。在我的问题中,我可能没有很好地说明这一点。类型提示将不起作用,因为它们不在initI中。实际上我以前已经尝试过了。但是类型提示不是这样工作的。我可能没有在我的问题中详细说明这一点。类型提示不起作用,因为它们不在init中。我更喜欢内置的东西。然而,我也不知道如何使用类型暗示。你确定这不适用于你的IDE吗?ipython知道如何使用RecordClassis自动完成,但我从未说过它不起作用。但同样,我如何在recordclass中使用类型提示。在我看来,这是行不通的。Jodo:recordclass已经支持typehits::from recordclass导入recordclass from type import Any class ConnectionConfigRecordClass:name:str url:str port:int user:str=pwd:str=client:Any=None>>>cf=ConnectionConfig'name','example.com',8080',qwerty',None>>>printcf.name,cf.url,cf.port,cf.pwd,reprcf.client name example.com 8080无我更喜欢内置的东西。然而,我也不知道如何使用类型暗示。你确定这不适用于你的IDE吗?ipython知道如何使用RecordClassis自动完成,但我从未说过它不起作用。但同样,我如何在recordclass中使用类型提示。在我看来,这是行不通的。Jodo:recordclass已经支持typehits::from recordclass导入recordclass from type import Any class ConnectionConfigRecordClass:name:str url:str port:int user:str=pwd:str=client:Any=None>>>cf=ConnectionConfig'name','example.com',8080',qwerty',None>>>printcf.name,cf.url,cf.port,cf.pwd,reprcf.client name example.com 8080 None