gpt4 book ai didi

python - 在不导入类型 Foo 的情况下确定对象是否为 Foo 类型

转载 作者:太空狗 更新时间:2023-10-30 00:47:29 28 4
gpt4 key购买 nike

假设我在文件中定义了一个类:

import stuff
import more stuff
import stuff that takes a long time to import
class Foo(object):
def __init__(self, arg1, arg2 etc.):
self.arg1 = arg1
self.arg2 = arg2
# Lots of other stuff
# Lots of methods

在另一个文件中我有这段代码:

from big_file import Foo
def do_stuff(obj):
if isinstance(obj, Foo):
do_stuff
else:
do_other_stuff

假设由于我无法控制的原因,文件 Foo 需要很长时间才能导入。我如何重构此代码以不导入 Foo 但仍可靠地检查类型?我认为鸭子打字不适合我的特殊情况。

我应该例如检查 obj 基的字符串表示?还是有另一种更规范的方式?

最佳答案

通常,这不是问题。如果您有一个 big_file.Foo 的实例,那么即使没有从您的其他文件中明确引用,它的父模块也已经在较早的时候导入了。 Python 模块仅在第一次导入时加载一次(前提是您没有进行任何显式重新加载或弄乱 sys.modules)。由于它已经被导入,在您的其他文件中执行 import big_file 应该会立即运行。

但是,如果您的其他文件只会在某些情况下遇到 big_file.Foo 并且 big_file 仅在实际需要时才在其他地方导入,那么您可以检查对象的类本身(这不支持子类):

def do_stuff(obj):
if (obj.__class__.__module__, obj.__class__.__name__) == ('big_file', 'Foo'):
do_stuff
else:
do_other_stuff

由于您已经指出 big_file.Foo 可以在应用程序的任何位置导入并且您希望支持子类,您可以检查它的模块是否已被导入并有条件地检查类型。

import sys

def is_Foo(obj):
if 'big_file' in sys.modules:
return isinstance(obj, sys.modules['big_file'].Foo)
else:
return False

def do_stuff(obj):
if is_Foo(obj):
do_stuff
else:
do_other_stuff

关于python - 在不导入类型 Foo 的情况下确定对象是否为 Foo 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49577290/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com