我有三个紧密联系在一起的变量,我不想每次调用函数时都单独传递。捆绑它们的正确方法是什么?
上下文:变量的目的是在逐字阅读文档时跟踪文档的某些属性。
我目前的方法是将它们捆绑在一个类中:
class MarkdownIsOpen(object):
def __init__(self):
self.ChapterOpen = False
self.SectionOpen = False
self.ArticleOpen = False
但这对我来说似乎有点不对劲,因为我不打算添加任何方法或其他功能。
一个命名元组如果是可变的,那将是完美的。
将这三个变量捆绑在一起的正确方法(最pythonic)是什么?
答案 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?
有两个不错的答案:recordclass 和namedlist个可变的替代命名元组
答案 3 :(得分:0)
如果您确实不需要在类上定义任何方法,则可以为此使用简单的named tuple或简单的字典。