python - 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 生成代码完成等。
有没有很好的方法来完成这项工作?
解决方案
函数的调用者无权访问函数内部声明的局部变量。因此,本地声明的类不能成为外部接口的一部分。
如果枚举根本不应该被调用者访问,那么它不应该被接受为参数;只需在函数体内声明和实例化枚举,并使其对调用者完全隐藏。
如果枚举意味着调用者可以作为公共接口的一部分访问,则需要在与函数本身相同/更高的范围内声明它(即在函数之外)。
如果你想封装函数和枚举,一个类将是这样做的典型方式(即函数和枚举都是类的公共成员)。
如果你真的希望能够以函数成员的身份访问枚举类,你可以做一些古怪的事情,比如:
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)
推荐阅读
- python - 使用 BeautifulSoup 和 Python 在 YouTube 上查找链接
- performance - Power BI 在执行时使用 90+% CPU.. 什么?
- html - 将 Dom 元素的原始数组与 Dom 元素的排序数组进行比较并检查它们是否不同
- amazon-web-services - RESTful API 最大限制:API 队列
- python-3.x - 如何使用 python 的 docxtpl 将多个图像插入到表中?
- ios - 在 Swift 中解压缩在 PHP 中压缩的 .gz 文件会给我一个 invalidData 错误
- vue.js - 这是在 sfc vue 方法中未定义的
- swift - 在 UIViewControllerRepresentable 中设置 ViewController 的属性
- jenkins - 如何使用 ZAPI 通过检查 zephyr 测试 ID 将 jenkins 测试结果自动更新到 zephyr
- ios - 选择器选项未动态更新 SwiftUI