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

时间:2019-04-10 09:22:35

标签: python

我有三个紧密联系在一起的变量,我不想每次调用函数时都单独传递。捆绑它们的正确方法是什么?

上下文:变量的目的是在逐字阅读文档时跟踪文档的某些属性。

我目前的方法是将它们捆绑在一个类中:

class MarkdownIsOpen(object):
    def __init__(self):
        self.ChapterOpen = False
        self.SectionOpen = False
        self.ArticleOpen = False

但这对我来说似乎有点不对劲,因为我不打算添加任何方法或其他功能。

一个命名元组如果是可变的,那将是完美的。

将这三个变量捆绑在一起的正确方法(最pythonic)是什么?

4 个答案:

答案 0 :(得分:3)

您可以使用dataclasses

@dataclass
class MarkdownIsOpen:
    ChapterOpen: bool = False
    SectionOpen: bool = False
    ArticleOpen: bool = False

答案 1 :(得分:3)

使用dataclass

@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类似的东西,而是具有以下属性的 special 容器。

将此与例如C的struct或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'

答案 2 :(得分:2)

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

有两个不错的答案:recordclassnamedlist个可变的替代命名元组

答案 3 :(得分:0)

如果您确实不需要在类上定义任何方法,则可以为此使用简单的named tuple或简单的字典。