C_Z*_*_Z_ 6 python typechecking python-2.6
假设我在文件中定义了一个类:
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
Run Code Online (Sandbox Code Playgroud)
在另一个文件中我有这个代码:
from big_file import Foo
def do_stuff(obj):
if isinstance(obj, Foo):
do_stuff
else:
do_other_stuff
Run Code Online (Sandbox Code Playgroud)
假设文件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
Run Code Online (Sandbox Code Playgroud)
由于您已指出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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
530 次 |
| 最近记录: |