繁体   English   中英

如何注释函数枚举

[英]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

枚举后端认为FUN1FUN2应该是方法而不是枚举成员。 枚举后端不支持将函数用作枚举值。 mypy 会认为FuncEnum.FUN1FuncEnum的一个实例,但实际的运行时机制不会以这种方式处理事情,因此您会在运行时行为和静态分析的想法之间产生冲突。

注释系统不支持您尝试执行的操作,无论有无枚举。 最接近的是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM