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 patch
f()
在该模块中不返回您的类型。

这是我所能提供的最好的:

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