python - 如何导入方法包装类型?
问题描述
我有一个递归包装对象的库模块包装器。我想确定一个对象是否具有类似函数的类型。我可以使用以下方法检查几乎所有类似函数的对象:
inspect.isbuiltin(object=obj) or
inspect.isfunction(object=obj) or
inspect.ismethod(object=obj) or
inspect.ismethoddescriptor(object=obj)
问题是此代码未检测到某些绑定方法,例如:
s = "Hello, world!"
type(s.__add__)
# method-wrapper
我想我无法检查正在method-wrapper
使用inspect
模块的对象。但是如何导入这种类型呢?我没找到。
现在我的代码中有一个丑陋的黑客:
MethodWrapper = type(''.__add__)
isinstance(obj, MethodWrapper)
UPD0:
我不想使用callable
,因为它检测到实现的类和对象__call__
,但我希望单独处理这些类和对象。
解决方案
该types
模块为许多“实现”类型提供了名称,包括几个用 C 实现的函数的名称。 的具体示例type("".__str__)
,MethodWrapperType
刚刚在 CPython 3.7 中添加。
因为这个区域很微妙,种类也很多,callable
可能真的是最好的选择。您可以轻松地首先检查type
对象以“排除”类,并且可以使用各种启发式方法(例如,try
调用vars
对象或检查type(x).__module__
)来识别典型的“可调用对象”(并不是那些与内置的根本不同)函数类型)。
推荐阅读
- ios - react-native-login-twitter 被 TestFlight 拒绝,因为它使用 UIWebView
- flutter - Flutter 小部件在行中的动态高度
- sec - pinpoll 民意调查的可信度如何
- android - 为包含 UI 模式对话框和长时间运行的任务的流程创建反应链的正确方法是什么?
- c++ - 将具有动态范围的 std::span 转换为具有静态范围的 std::span
- canvas - 如何在嵌入不和谐中编辑图像?
- javascript - 单选按钮有时无法获得价值
- sql - 如何使用 SELECT * INTO(PIVOT Result 查询)创建具有透视结果的表
- c++ - 我可以将 CPLEX 更改为 CBC 求解器吗?
- image - PayPal NVP 标题图像 (HDRIMG)