首页 > 解决方案 > Python:如何使用嵌套的枚举作为嵌套函数的默认参数?

问题描述

有没有办法在python中做这样的事情?

from enum import Enum, auto
def some_func(mode = Mode.A):    
    class Mode(Enum):
        A = auto()
    print(mode == Mode.A)

期望的结果

>>> some_func()
True

上面的代码片段失败了,NameError: name 'Mode' is not defined大概是因为class Mode在解释器读取时没有定义def some_func(mode = Mode.A):

您当然可以将 Enum 放在函数之外,但是,如果我的建议或类似的方法有效,我宁愿将其保留在里面。将它保存在封装模式中,希望在其中使用它,希望允许.语法将它与其他类似的Mode类区分开来。

我知道很多 python 代码只是为此目的使用字符串,而不是使用枚举。但是我想找到一个使用枚举的解决方案。枚举更易于维护并帮助 IDE 生成代码完成等。

有没有很好的方法来完成这项工作?

标签: pythonenumsinner-classesencapsulation

解决方案


函数的调用者无权访问函数内部声明的局部变量。因此,本地声明的类不能成为外部接口的一部分。

如果枚举根本不应该被调用者访问,那么它不应该被接受为参数;只需在函数体内声明和实例化枚举,并使其对调用者完全隐藏。

如果枚举意味着调用者可以作为公共接口的一部分访问,则需要在与函数本身相同/更高的范围内声明它(即在函数之外)。

如果你想封装函数和枚举,一个类将是这样做的典型方式(即函数和枚举都是类的公共成员)。


如果你真的希望能够以函数成员的身份访问枚举类,你可以做一些古怪的事情,比如:

from enum import Enum, auto
from typing import Optional


class SomeFunc:

    class Mode(Enum):
        A = auto()
        B = auto()

    def __call__(self, mode: Optional['Mode'] = None) -> None:
        if mode is None:
            mode = self.Mode.A
        print(mode == self.Mode.A)


some_func = SomeFunc()

some_func()
some_func(some_func.Mode.B)

推荐阅读