如何在Python中正确地捆绑变量?

2024-09-30 10:37:46 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

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

如果namedtuple是可变的,那么它将是完美的。在

将这三个变量捆绑在一起的恰当(最具Python式的)方式是什么?在


Tags: 方法文档selffalse属性objectinitdef
3条回答

使用dataclass

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

或者:

^{pr2}$

请注意,这需要Python3.7。在

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

例如,将其与C的struct或Scala的{}进行比较,它们的作用基本相同。在

此外,您甚至可以重写__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'

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

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

您可以使用dataclasses。在

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

相关问题 更多 >

    热门问题