Cla*_*ell 21 python types module class typechecking
需要一种方法来检查某个对象是否是某个特定模块中任何类的实例.
我知道我可以通过显式导入该模块中的每个类并使用元组检查来实现:
from my_module import ClassOne, ClassTwo
>>> isinstance(my_obj, (ClassOne, ClassTwo))
True
Run Code Online (Sandbox Code Playgroud)
但实际上,我从中导入的模块中有一个类的TON,并且显然无需详细地将它们全部导入,使用它们构建一个巨大的元组,并对其进行类型检查.我尝试了一些方法来避免这种情况:
import my_module
# Test my_obj against the module itself
>>> isinstance(my_obj, my_module)
TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types
# Try to test against a wildcard attribute on my_module
>>> isinstance(my_obj, my_module.*)
SyntaxError: invalid syntax
#Try to build a tuple of clases with iteration to check against
>>> for klass in my_module:
TypeError: 'module' object is not iterable
Run Code Online (Sandbox Code Playgroud)
有没有办法对my_module中的所有类进行检查,而不在元组中明确命名它们?
可选背景信息:
我可能忽视了解决问题的更好方法 - 如果您想知道,情况如下:
我们正在将数据从Google App Engine应用程序导出到我们在Rackspace上托管的应用程序.我们将数据序列化pickle,然后通过HTTP请求将其发送到我们的Rackspace服务器.
Google App Engine数据库中的部分数据属于GAE特定的数据类型,从google.appengine.api.datastore_types导入.如果这些数据类型中的任何一种都通过线路连接到我们的Rackspace服务器,它们将引发错误消除,因为我们的Rackspace应用程序没有所需的GAE库.因此,在离开GAE的路上,我正在检查是否有任何传出对象都有来自google.appengine.api.datastore_types的类型.如果他们这样做,我要么将它们转换为内置数据类型,要么删除该对象的字段.
mgi*_*son 13
您可以使用inspect.getmembers获取模块中的所有类:
inspect.getmembers(my_module,inspect.isclass)
Run Code Online (Sandbox Code Playgroud)
这将返回一个名称 - 类对的列表.你只想要这些课程:
my_module_classes = tuple(x[1] for x in inspect.getmembers(my_module,inspect.isclass))
Run Code Online (Sandbox Code Playgroud)
在我最初写这个答案时,我设法忽略的一件事是能够检查一个类的__module__属性.您可以通过检查是否__module__符合您的预期来逃脱:
from somewhere import module
if getattr(obj, '__module__', None) == module.__name__:
# obj is from module.
Run Code Online (Sandbox Code Playgroud)
这可能比isinstance检查大量类名更便宜.