Python——检查对象是否是某个modu中任何类的实例

2024-06-01 12:38:12 发布

您现在位置:Python中文网/ 问答频道 /正文

需要一种方法来检查对象是否是某个特定模块中任何类的实例。

我知道可以通过显式导入该模块中的每个类并使用元组进行检查来完成此任务:

from my_module import ClassOne, ClassTwo

>>> isinstance(my_obj, (ClassOne, ClassTwo))
True

但实际上,我从中导入的模块中有大量的类,显式导入它们、使用它们构建一个巨大的元组并对其进行类型检查似乎是不必要的冗长。我试过一些方法来避免这种情况:

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

有没有一种方法可以对my_模块中的所有类进行类型检查,而不必在元组中显式命名它们?

可选背景信息:
我可能忽略了更好的解决问题的方法--如果你想知道的话,现在的情况是:

我们正在将数据从Google应用程序引擎应用程序导出到我们在Rackspace上托管的应用程序。我们用pickle序列化数据,然后用HTTP请求将其发送到Rackspace服务器。

Google App Engine数据库中的一些数据是从Google.appengine.api.datastore_类型导入的特定于GAE的数据类型。如果这些数据类型中的任何一个通过连接到我们的Rackspace服务器,它们将引发一个错误depickling,因为我们的Rackspace应用程序没有所需的GAE库。所以,在离开GAE的路上,我要检查是否有任何传出对象具有来自google.appengine.api.datastore的类型。如果是,我要么将它们转换为内置数据类型,要么删除对象中的字段。


Tags: 模块to数据对象方法obj应用程序类型
2条回答

我使用了@mgilson简单的解决方案:

from somewhere import module

if getattr(obj, '__module__', None) == module.__name__:
    # obj is from module.

注意,如果您有一个模块树,并且希望确保它来自基本模块,则必须执行以下操作:

from somewhere import module

if getattr(obj, '__module__', None).split('.')[0] == module.__name__:
    # obj is from module.

但是如果您的object来自内置的,它将引发一个异常,因此我会:

from somewhere import module

module_tree = getattr(obj, '__module__', None)
parent = module_tree.split('.')[0] if module_tree else None

if parent == module.__name__:
    # obj is from module.

可以使用^{}获取模块中的所有类:

inspect.getmembers(my_module,inspect.isclass)

这将返回名称类对的列表。你只要上课:

my_module_classes = tuple(x[1] for x in inspect.getmembers(my_module,inspect.isclass))

当我最初编写这个答案时,我忽略了一件事,那就是检查类的__module__属性的能力。您可能可以不必检查__module__是否符合您的预期:

from somewhere import module

if getattr(obj, '__module__', None) == module.__name__:
    # obj is from module.

这可能比isinstance检查大量类名要便宜。

相关问题 更多 >