python - 如何更改类型(对象)的结果?
问题描述
我正在使用一个 3rd-party Python 模块,它做了一些可怕的事情,比如:
def foo(x):
if type(x) is str:
do_useful_thing()
我有一个子类str
:
class mystr(str):
....
我想调用foo()
一个mystr
实例,但它失败了,因为type(mystr) != type(str)
. 有什么办法可以让我的课程让我type(mystr) == type(str)
接受foo
它吗?
我知道正确的解决方案是让 3rd-party 模块使用isinstance
,但不幸的是我无法改变它。
解决方案
您可以劫持type
第 3 方模块的内置函数。
因此,如果第 3 方代码是这样的:
# bar.py (a.k.a, crappy 3rd-party code)
def foo(x):
if type(x) is str:
return True
return False
你可以这样写:
import bar
class MyStr(str):
pass
# Returns False.... BOOO!
bar.foo(MyStr())
def fake_type(a):
if isinstance(a, MyStr):
return str
else:
return type(a)
bar.type = fake_type
# This should now return True :-)
bar.foo(MyStr())
并且不要忘记告诉第 3 方修复他们的代码,以便您以后可以摆脱这种黑客攻击。
推荐阅读
- python - 寻找修复算法的方法。使用动态规划实现组合和 II
- macos - 运行 cron 作业时执行 Fastlane 命令缺少 Gem
- android - 使用 Handler 删除 Firebase DatabaseReference 侦听器的替代方法是什么?
- javascript - ES6提取具有id数组的对象的数组过滤数组
- apache-kafka - Kafka - 在错误主题中重新驱动事件
- python - 如何循环和附加 pd 列 + groupby 逻辑
- algorithm - 用于生成基于网格的城镇的程序算法的想法
- python - 四舍五入到增量 Python
- python - 我的 Scrapy 代码要么过滤太多,要么重复抓取相同的东西
- php - 如何使用 google sheet api 获取过滤后的电子表格的价值?