Python 欺骗巨蟒';s`type(f(x))是`
有一个具有以下代码的检查器:Python 欺骗巨蟒';s`type(f(x))是`,python,types,Python,Types,有一个具有以下代码的检查器: assert type(f(x)) is int 我不能将其更改为isinstance或类似的内容 f必须返回我编写的类的对象。有没有办法欺骗这种支票?类似于从int继承类或者更正返回对象的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>属性?您可以通过 这些等价性假定debug和AssertionError引用具有这些名称的内置变量在当前实
assert type(f(x)) is int
我不能将其更改为isinstance
或类似的内容
f
必须返回我编写的类的对象。有没有办法欺骗这种支票?类似于从int
继承类或者更正返回对象的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>属性?您可以通过
这些等价性假定debug和AssertionError引用具有这些名称的内置变量在当前实现中,内置变量_debug _uu在正常情况下为True,在请求优化时为False(命令行选项-O)。在编译时请求优化时,当前代码生成器不会为assert语句发出代码。请注意,没有必要在错误消息中包含失败表达式的源代码;它将显示为堆栈跟踪的一部分
您不能欺骗type()
函数或是
运算符,否
不要使用type()
检查类型。使用isinstance()
,您可以将int
子类化:
>>> class MyType(int):
... pass
...
>>> isinstance(MyType(), int)
True
或者测试,您甚至不需要子类,只需注册您的类型:
>>> from numbers import Integral
>>> isinstance(42, Integral)
True
>>> isinstance(MyType(), Integral)
True
>>> class Foo: pass
...
>>> isinstance(Foo(), Integral)
False
>>> Integral.register(Foo)
>>> isinstance(Foo(), Integral)
True
如果你不能改变这种说法,那你就是运气不好。您最多可以使用monkey patchf()
在该模块中不返回您的类型。这是我所能提供的最好的:
type = lambda x: int
assert type(f(x)) is int
如果你不能改变这种说法,那你就是运气不好。谢谢你的讽刺,我没有问你我是否运气好!对不起,这不是讽刺,这是成语,一种表达。我要换个说法:你不能。没有办法做到这一点。是否在两个位置调用了f
?一次在断言行上,一次在实际代码中?您是否可以检测哪个是哪个,并返回0
以屏蔽断言?如果assert
位于另一个模块中,则不确定这是否会切断断言。也许othermodule.type=…
会起作用though@Eric不会的。这是愚蠢的半开玩笑的回答。除非作为局部变量,否则不能重写类型
。我不确定是否同意。我想你可以搞乱别人的世界module@Eric但是它是内置函数,它甚至不属于模块。啊,我想我把这和当mymodule.py
包含import math
,而另一个包含import mymodule;mymodule.math.pi
。