【问题标题】:Python -- using function attributes as return values [duplicate]Python——使用函数属性作为返回值
【发布时间】:2013-11-09 09:11:23
【问题描述】:

我有一个函数,它有几个可能的返回值。举个简单的例子,假设它接受一个正整数并返回“小”、“中”或“大”:

def size(x):
    if x < 10:
        return SMALL
    if x < 20:
        return MEDIUM
    return LARGE

我想知道编写和定义返回值的最佳方式。我想知道使用Python函数属性,如下:

def size(x):
    if x < 10:
        return size.small
    if x < 20:
        return size.medium
    return size.large

size.small = 1
size.medium = 2
size.large = 3

那么我的调用代码如下所示:

if size(n) == size.small:
    ...

这似乎是一个不错的内置“枚举”,可能比创建模块级枚举或将 3 个值定义为全局常量(如 SIZE_SMALL, SIZE_MEDIUM 等)更清晰/更简单。但我不认为我以前见过这样的代码。这是一个好方法还是有陷阱/缺点?

【问题讨论】:

  • 为什么不使用类?然后您可以返回可以从类外部使用的类变量。这是一个更多的oop。
  • @wim:我没有看到任何关于函数属性的内容。这只是一个关于一般枚举的问题。我问的是实现枚举类型结构的特定技术。
  • 这些通常定义为模块/全局变量,因为知识需要处于模块/全局级别,即代码设置中的其他位置。small = var
  • @tk,有效点,但函数 size 本身不是私有的,因此它的属性也可以在模块/全局级别访问。
  • 因此,如果值的知识严格属于函数,那么您的方式是正确的,但是如果有歧义,我会考虑将其放在其他地方。

标签: python enums


【解决方案1】:

虽然你可以,但我不会,尤其是现在 Python 在 3.4 中有一个 Enum type,它一直是 backported

您上面的示例可能类似于Enum

class Size(Enum):

    small = 1
    medium = 2
    large = 3

    @classmethod
    def classify(cls, number):
        if number < 10:
            return cls.small
        elif number < 20:
            return cls.medium
        else:
            return cls.large

使用中:

--> Size.classify(15)
<Size.medium: 2>

【讨论】:

    【解决方案2】:

    namedtuple,也许?

    >>> from collections import namedtuple
    >>> 
    >>> SizeSpec = namedtuple('SizeSpec', ['small', 'medium', 'large'])
    >>> 
    >>> size = SizeSpec(small=1, medium=2, large=3)
    >>> 
    >>> size.small
    1
    >>> size.medium
    2
    >>> size.large
    3
    

    【讨论】:

      猜你喜欢
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 2019-10-07
      • 2020-03-26
      • 2021-11-25
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      相关资源
      最近更新 更多