2017-09-16 64 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