我经常发现自己写的多语句表达式在运行时验证类型的变量。例如,假设我想验证一个特定的输入是富对象的列表,我可能会写下面的表达式:有没有办法做判断的对象是在运行时pep484风格表达的“实例”?
assert(_isinstance(x, list) and all(_isinstance(y, Foo) for y in x))
我宁愿能写类似:
# pseudocode
_assert(isinstance(x, typing.List[Foo]))
换句话说,我要问x是美孚的实例的列表。
如果可以作出努力,这将是更好,因为Pep484语法简明地指定类型的嵌套结构的好方法。当然,我们都知道,这是没有办法的办法Python的内置isinstance函数的工作......但只是我的梦想了一会儿:
我们都熟悉,如果外返回true的isnstance功能一个结构类型是一个类的实例:
# real python:
isinstance(["a", "b", "c"], list) => True
但是假设我想要做更深入的检查:我想这样做:
# pseudocode:
import typing
_isinstance("x", str) => True
_isinstance(["a", "b", "c"], typing.List[str]) => True
_isinstance(["a", "b", "c"], typing.List[float]) => False
_isinstance([{"x":3}], typing.List[typing.Map[str,int]]) => True
这样的想法是函数如果第一个参数完全对应于Pep484风格表达式,则返回True第二个论点的离子。
当然,有些人会指出,明确的静态和运行时类型检查违背“鸭打字”的精神。这是真的 - 但没有用。有时你确实想要验证输入的结构。随着项目变得越来越大,你有时候想你想要什么,你正在处理,并在其他时间类型的鸭打字给你的灵活性,肯定知道的能力。
因此,这里是我的问题:有没有人见过的方式来比较类型Pep484风格的表达式?如果已经有一个图书馆或功能来做它,那么我宁愿不重新发明轮子。也许打字库已经有办法做到这一点。请指点我吧!
您已经使用'你的所有假设的例子向后isinstance'。不是说如果你翻动它,它会起作用。 'isinstance'不会做你想做的。 – ShadowRanger
这是向后一个例子 - 我已经纠正了,谢谢! –
在另一个示例中,您只是将其作了倒退。原型是'isinstance(OBJ,type_or_tuple_of_types)','未isinstance(type_or_tuple_of_types,OBJ)'。测试'x'是类型还是'list'的子类型是'isinstance(x,list)',而不是'isinstance(list,x)'。 – ShadowRanger