在 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)
我知道这是一个简单的问题,但我不知道这叫什么,我在网上找不到任何细节...
使用 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)