在 class 中定义值列表

Defining a list of values within a class

我知道这是一个简单的问题,但我不知道这叫什么,我在网上找不到任何细节...

使用 Python 2.6,我只是想引用一些在 class 中定义的预定义值。我希望用户在使用 class 时能够引用它们,并在验证传递给 class.[=15= 函数的参数时在 class 中使用这些值]

在我的示例中,允许有四种不同的严重性级别。目前,用户需要使用 Issue.severity_levels["critical"] 来检索关键问题的正确值。我希望他们能够改用 Issue.severity_levels.critical。我还希望能够使用 if severity not in severity_levels: 来验证传递给函数的严重性参数。

我的例子:

class Issue:

    severity_levels = {"critical": "critical", "info": "info", "warning": "warning",
                       "error": "error"}

    @classmethod
    def page_out(description, ticket, details, severity="critical", custom=None):

        # Normalize severity
        severity = severity.lower()

        # Stop with error on a bad severity level
        if severity not in severity_levels:
            raise ValueError("Invalid severity")

        # do stuff...

这个叫什么?我如何在 Python 2.6 中实现它? (是的,那很旧,但那是我们现在工作的环境,正在更换,但新系统还没有准备好。)

这可以通过组合 namedtuple(根据互联网,这是在 Python 2.6 中引入的)和 class 属性(据我所知,也可用)。

namedtuple 就像元组和字典的组合(也像迷你 class)。您可以使用点符号按名称访问元素,还可以像使用常规元组一样检查是否包含。您甚至可以为它们编制索引。

from collections import namedtuple

# Define the namedtuple
Levels = namedtuple('Levels', ['critical', 'info', 'warning', 'error'])


class Issue:

    # Create the class attribute, an instance of the namedtuple defined above
    severity_levels = Levels('critical', 'info', 'warning', 'error') #=  {"critical": "critical", "info": "info", "warning": "warning", "error": "error"}
    
    @classmethod
    def page_out(description, ticket, details, severity="critical", custom=None):

        # Normalize severity
        severity = severity.lower()
        
        # Stop with error on a bad severity level
        if severity not in severity_levels:
            raise ValueError("Invalid severity")


'critical' in Issue.severity_levels  # True

'new' in Issue.severity_levels   # False

Issue.severity_levels.info   # 'info'

Issue.severity_levels[0]   # 'critical'

附录

从 'value' 得到 'key' 有点复杂:

# using a list comprehension (I think this works in 2.6)
[k for k, v in Issue.severity_levels._asdict().items() if v == 'error']

# using a for loop
for k, v in Issue.severity_levels._asdict().items():
    if v == 'error':
        print(k)