[英]How to anotate function Enums
我有一个将其他函数作为参数的函数,该函数可以采用一些可能的选项,我想使用枚举和类型提示正确注释它们:
这是我尝试过的:
from typing import Callable
from enum import Enum
def test1():
print('hi')
def test2():
print('hi2')
class FuncEnum(Enum):
FUN1 = test1
FUN2 = test2
# option 1, mypy will complain because FuncEnum.FUN1 is not in the Callable type
def my_annotated_function(func: Callable = FuncEnum.FUN1):
func()
# option 2, func is not callable. as it is FuncEnum type (not Callable)
def my_annotated_function(func: FuncEnum = FuncEnum.FUN1):
func()
代码起作用的问题只是 IDE/mypy 使用两种语法都会引发警告。
我也尝试过对 Callable 进行子类化,但它似乎不起作用:
class FuncEnum(Callable, Enum):
FUN1 = test1
FUN2 = test2
不知何故,这种注释似乎丢失了 lintern/mypy,有什么解决方法吗?
请注意,调用:
my_annotated_function(FuncEnum.FUN1) # should be a valid input
def random_function():
pass
my_annotated_function(random_function) # should be raised by mypy
枚举不是那样工作的。 如果你这样做
class ExampleEnum(Enum):
x = 1
y = 2
ExampleEnum.x
不是1
。 枚举元类后端将ExampleEnum.x
设置为ExampleEnum
的实例,其value
属性设置为1
。 枚举实例不是它的值,它的行为也不像它的值。
除此之外,尝试将函数用作枚举值还有一个额外的问题。 在你的情况下,
class FuncEnum(Enum):
FUN1 = test1
FUN2 = test2
枚举后端认为FUN1
和FUN2
应该是方法而不是枚举成员。 枚举后端不支持将函数用作枚举值。 mypy 会认为FuncEnum.FUN1
是FuncEnum
的一个实例,但实际的运行时机制不会以这种方式处理事情,因此您会在运行时行为和静态分析的想法之间产生冲突。
注释系统不支持您尝试执行的操作,无论有无枚举。 最接近的是typing.Literal
,但您不能将其与函数一起使用。 您可以将它与枚举一起使用,但枚举不会做您想做的事情。
关于将函数用作枚举成员,请参阅此问题。 如果您只想允许传递枚举成员,那么以下将起作用( 操场):
from functools import partial
from typing import Callable
from enum import Enum
def test1():
print('hi')
def test2():
print('hi2')
class FuncEnum(Enum):
FUN1 = partial(test1)
FUN2 = partial(test2)
def my_annotated_function2(func: FuncEnum = FuncEnum.FUN1):
func.value() # Actual callable is in `value` attribute
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.