【问题标题】:How to properly function annotate function-argument [duplicate]如何正确运行注释函数参数[重复]
【发布时间】:2017-01-11 16:12:30
【问题描述】:

我希望我的函数被注释为它接受另一个函数作为参数。起初我认为这会很好地工作:

def my_function(func_argument: function):
    pass

然而函数是未解析的引用。我查看了内置函数,它确实不存在,这与我通常使用的 str、int 和其他函数不同。但是,它必须在某个地方,因为:

>>> def my_function():
...     pass
... 
>>> x = my_function
>>> type(x)
<class 'function'>
>>> type(x).__name__
'function'

函数类在哪里定义的,为什么不是内置的?我最初的尝试应该是正确的解决方案吗?现在我用types.FunctionType注释它,但感觉不对,因为在其他地方我们暗示str而不是types.StringType。并且仅为一个注释导入类型也很奇怪。 typing library 也没有任何可以帮助我替换它的东西。

另外,FunctionType 将如何与类型注释强制库一起工作(我看到其中很少有人飞来飞去)

【问题讨论】:

    标签: python python-3.x types type-hinting


    【解决方案1】:

    为什么不使用Callable

    期望特定签名的回调函数的框架可能 使用Callable[[Arg1Type, Arg2Type], ReturnType]进行类型提示


    from typing import Callable
    
    def my_function(func_argument: Callable[..., ReturnType]): # replace ReturnType with return type of func_argument
        pass
    

    【讨论】:

    • 我在打字时忽略了 Callable,但它实际上很有意义,因为它适用于 lambda 和函数。我有点不喜欢它必须有一个返回类型,因为并非所有函数都返回一些东西——它们是否应该将 None 作为第二个参数?对于没有打字库经验的人来说也不太清楚,但我想这更像是打字问题而不是 SO 问题,谢谢:)
    • @iScrE4m None 可用于不返回任何内容的函数,它们实际上返回None
    • 啊,好的,非常感谢!
    猜你喜欢
    • 2020-01-28
    • 1970-01-01
    • 2011-03-14
    • 2016-01-07
    • 2023-03-09
    • 1970-01-01
    • 2015-01-06
    • 2011-05-01
    • 2012-11-23
    相关资源
    最近更新 更多