为了账号安全,请及时绑定邮箱和手机立即绑定

在python中捆绑变量的正确方法是什么

在python中捆绑变量的正确方法是什么

弑天下 2022-01-05 19:41:26
我有三个紧密联系在一起的变量,我不想每次调用函数时都单独传递。捆绑它们的正确方法是什么。上下文:变量的目的是在我逐字阅读文档时跟踪文档的某些属性。我目前的方法是将它们捆绑在一个类中:class MarkdownIsOpen(object):    def __init__(self):        self.ChapterOpen = False        self.SectionOpen = False        self.ArticleOpen = False但这对我来说似乎有点错误,因为我不打算添加任何方法或其他功能。如果它是可变的,那么命名元组将是完美的。捆绑三个变量的正确(最pythonic)方法是什么?
查看完整描述

3 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

使用数据类:


@dataclass

class MarkdownIsOpen:

    ChapterOpen: bool = False

    SectionOpen: bool = False

    ArticleOpen: bool = False

或者:


MarkdownIsOpen = make_dataclass('MarkdownIsOpen', ['ChapterOpen', 'SectionOpen', 'ArticleOpen'])

请注意,这需要 Python 3.7。


如果您使用的是 Python <= 3.6,那么普通类也可以。类并不昂贵,它们向用户提供了一个提示,即您的函数不需要任何dict类似旧的,而是具有以下属性的特殊容器。


将此与例如 Cstruct或 Scala 的 进行比较case class,它们的用途大致相同。


此外,您甚至可以覆盖__slots__和/或__getitem__允许dict类似访问,并防止添加新属性:


class MarkdownIsOpen:


    __slots__ = ('ChapterOpen', 'SectionOpen', 'ArticleOpen')


    def __init__(self):

        self.ChapterOpen = False

        self.SectionOpen = False

        self.ArticleOpen = False


    def __getattr__(self, key):

        return getattr(self, key)


    def __setattr__(self, key, value):

        setattr(self, key, value)

例子:


m = MarkdownIsOpen()

m['ChapterOpen'] = True

print(m['SectionOpen'])

m['Nonexistent'] = False

输出:


False

AttributeError: 'MarkdownIsOpen' object has no attribute 'Nonexistent'


查看完整回答
反对 回复 2022-01-05
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

您可以使用数据类。


@dataclass

class MarkdownIsOpen:

    ChapterOpen: bool = False

    SectionOpen: bool = False

    ArticleOpen: bool = False


查看完整回答
反对 回复 2022-01-05
?
www说

TA贡献1775条经验 获得超8个赞

可以看看这个问题:Existence of mutable named tuple in Python?

凭借两个漂亮的答案:recordclass 和namedlist可变替代命名元组


查看完整回答
反对 回复 2022-01-05
  • 3 回答
  • 0 关注
  • 225 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信