2017-09-16 46 views
0

我开发了一个工具,我想在另一个应用程序中使用它。现在,我只需在新应用程序中复制我的工具。文件体系结构如下所示。isinstance使用嵌套的应用程序返回不正确的结果

. 
├── inner 
│   ├── a 
│   │   ├── a.py 
│   │   └── __init__.py 
│   ├── b 
│   │   ├── b.py 
│   │   └── __init__.py 
│   ├── __init__.py 
│   └── inner.py 
└── outer.py 

a.py

class A(object): 

    def output(self): 
     print('A') 

b.py

from a.a import A 


class B(object): 

    def output(self, a): 
     print('B') 
     print(isinstance(a, A)) 

inner.py

from a.a import A 
from b.b import B 

a = A() 
b = B() 
a.output() 
b.output(a) 

B.output将检查第二个参数a是否是一个实例的A级。在折叠下运行inner.pyinner使输出

A 
B 
True 

然而,当我在我的新的应用程序文件夹运行几乎相同的代码outer.py,预计不会输出。

A 
B 
False 

outer.py

import sys 

sys.path.append('inner') 


if __name__ == '__main__': 
    from inner.a.a import A 
    from inner.b.b import B 
    a = A() 
    b = B() 
    a.output() 
    b.output(a) 

当我在outer.py添加print(a),我得到<inner.a.a.A object at 0x7f45e179f2d0>,不a.a.A object

我想知道,如何整合内部应用程序以使isinstance返回正确的结果?我应该将inner下的所有文件夹添加到sys.path?如果是这样,我会选择删除类型检测。

回答

0

这确实会不时问到,但我找不到合适的副本。

而不是运行脚本内,使之成为一个可安装Python包,你将安装和使用python -m inner.inner运行给定的模块__main__的。

+0

一个我以前从未知道的好主意!但是,我必须用'from inner.a.a import A'来更改'inner/b/b.py'的第一行以运行'inner.py'。它是唯一一种在开始时指定工具名称的唯一方法吗? –

+0

@AnttiHaapala这听起来很有趣;你能分享一个例子吗?我试图更好地理解你的建议 – Vinny