首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python可变NamedTuple

Python可变NamedTuple
EN

Stack Overflow用户
提问于 2017-10-21 17:16:32
回答 6查看 2.3K关注 0票数 3

我正在寻找一个类似于数据结构的结构,我可以从其中创建多个实例,并且有一些类型提示,而不是不可变的。

所以我有这样的东西:

代码语言:javascript
复制
class ConnectionConfig(NamedTuple):
    name: str
    url: str
    port: int
    user: str = ""
    pwd: str = ""
    client: Any = None

但我希望它是可变的。我可以这样做:

代码语言:javascript
复制
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)

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-10-27 00:27:52

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

代码语言:javascript
复制
class ConnectionConfig():
    def __init__(self, name: str, url: str, port: int, user: str = "",
                 pwd: str = "", client: Any = None):
        pass

阅读佩普0484,我还没有找到适合你需求的其他选择。继续使用PEP链,我想PEP 20 Python的禅宗引用的这段话解释了这一点:

应该有1,最好只有一种--很明显的方法。

票数 3
EN

Stack Overflow用户

发布于 2017-10-21 17:42:37

代码语言:javascript
复制
class ConnectionConfig():
    name: str
    url: str
    port: int
    user: str = ""
    pwd: str = ""
    client: Any = None
    def __init__(self, **kv):
        self.__dict__.update(kv)

然后,可以在构造函数中指定所有内容。

代码语言:javascript
复制
c=ConnectionConfig(port=22)

print (c.port)  # will print 22
票数 2
EN

Stack Overflow用户

发布于 2021-08-01 11:11:01

记录类库的基础上有一个紧凑的解决方案:

代码语言:javascript
复制
> pip3 install recordclass

from recordclass import dataobject

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

>>> con = ConnectionConfig('name','url',8080,'user','secret',tcp_client)

>>> sys.getsizeof(con)
108   # PyHEAD (16) + 6*sizeof(*void) bytes

如果希望更快地创建实例,则有一个选项:

代码语言:javascript
复制
class ConnectionConfig(dataobject, fast_new=True):
    name: str
    url: str
    port: int
    user: str = ""
    pwd: str = ""
    client: Any = None

(注意:这个版本可能不太适合IDE编辑器的自动完成)

另一种选择:

代码语言:javascript
复制
>>> from recordclass import make_dataclass
>>> ConnectionConfig = make_dataclass(
          "ConnectionConfig",
          [('name',str), ('url',str), ('port',str), 
           ('use',str), ('pwd',str), ('client',Any)],
          defaults=(None,), 
          fast_new=True)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46865909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档