Python 类型提示 pickable 参数

Python type hint pickable argument

提问人:Izaak Cornelis 提问时间:11/7/2023 更新时间:11/7/2023 访问量:113

问:

我想与我的代码用户沟通,某些函数需要一个可选取的对象。下面是从任何项目详细信息中抽象出来的示例:

import pickle
from typing import Callable


def pickable():
    print("I am pickable!")


def get_non_pickable():
    # local functions are not pickable
    def not_pickable():
        print("I am NOT pickable!")

    return not_pickable


def pickle_func(func: Callable[[], None]):
    with open("data.pickle", "wb") as f:
        pickle.dump(func, f, pickle.HIGHEST_PROTOCOL)


# fine:
pickle_func(pickable)

# not fine: should show in my editor that I am passing a non-pickable item
pickle_func(get_non_pickable())

是否可以键入提示,表明函数中的函数参数必须是可选取的?理想情况下,应保留参数的现有类型提示。funcpickle_func

python pickle 类型提示

评论

1赞 Klaus D. 11/7/2023
pickleble 不是一种类型,也不是一种特定的接口。它取决于对象及其属性和子属性,这些属性和子属性都可能在运行时更改。恕我直言,类型注释在这里不是正确的媒介。我建议用一种不太正式的方式来记录它,就像在文档字符串中一样。
0赞 dROOOze 11/9/2023
根据 docs.python.org/3/library/pickle.html#pickle-picklable,可以使用现有的静态类型检查器(如果允许自定义它们)进行静态分析,因为类型检查器需要解析对象的完全限定名称,而内部函数的完全限定名称通常包含非标识符。例如,mypy 插件可以将不可挑选的参数发送到您的使用get_function_signature_hookpickle_func

答:

1赞 JustLearning 11/7/2023 #1

酸洗保存函数的名称(“标识符”)。取消酸洗需要按名称重新导入函数。为此,需要在顶层定义函数。将一个函数包装在另一个函数中违反了此要求。

我不确定是否有办法对顶级函数进行类型提示。