Old*_*ool 5 python enums encapsulation inner-classes
有没有办法在 python 中做这样的事情?
from enum import Enum, auto
def some_func(mode = Mode.A):
class Mode(Enum):
A = auto()
print(mode == Mode.A)
Run Code Online (Sandbox Code Playgroud)
期望的结果
>>> some_func()
True
Run Code Online (Sandbox Code Playgroud)
上面的代码片段失败NameError: name 'Mode' is not defined可能是因为class Mode解释器读取时未定义def some_func(mode = Mode.A):
您当然可以将枚举放在函数之外,但是,如果我建议的或类似的方法有效,我宁愿将其保留在函数内部。将其保留在内部封装了要使用的模式,希望允许.语法将其与其他类似的类区分开来Mode。
我知道很多 python 代码只是使用字符串来达到此目的,而不关心枚举。不过我想找到使用枚举的解决方案。枚举更容易维护并帮助 IDE 生成代码完成等。
有没有一个好的方法来完成这项工作?
函数的调用者无权访问函数内部声明的局部变量。因此,本地声明的类不能成为外部接口的一部分。
如果调用者根本无法访问枚举,则不应将其接受为参数;只需在函数体内声明并实例化枚举,并将其对调用者完全隐藏。
如果枚举旨在作为公共接口的一部分可供调用者访问,则需要在与函数本身相同/更高的范围内声明它(即在函数外部)。
如果您想封装函数和枚举,类将是执行此操作的典型方法(即函数和枚举都将是该类的公共成员)。
如果您确实希望能够作为函数成员访问枚举类,您可以做一些奇怪的事情,例如:
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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1331 次 |
| 最近记录: |