2011-07-22 6 views
7

Ngay bây giờ tôi có một lớp được gọi là A.Python, làm hàng nhập khẩu có điều kiện đúng cách

Tôi có một số mã như thế này ..

from my.package.location.A import A 

... 


foo = A.doSomething(bar) 

này là rất tốt.

Nhưng bây giờ tôi có một phiên bản mới của A được gọi là A, nhưng trong một gói khác, nhưng tôi chỉ muốn sử dụng phiên bản A khác trong một kịch bản nhất định. Vì vậy, tôi có thể làm một cái gì đó như thế này:

if(OldVersion): 
    from my.package.location.A import A 
else: 
    from new.package.location.A import A 

... 

foo = A.doSomething(bar) 

Điều này làm việc tốt. Nhưng nó là xấu xí. Làm thế nào tôi có thể làm điều này tốt hơn? Tôi thực sự muốn làm điều gì đó như thế này

from my.abstraction.layer.AFactory import AFactory 
... 
myA = AFactory.giveMeA() # this looks at "OldVersion" and gives me the correct A 
foo = myA.doSomething(bar) 

có cách nào để tôi có thể làm điều đó dễ dàng hơn không? Không có lớp nhà máy? Điều này bây giờ có thể biến mọi cuộc gọi phương thức tĩnh trên lớp của tôi thành 2 dòng. Tôi luôn luôn có thể giữ một tài liệu tham khảo trong một lớp học để giảm tác động, nhưng im thực sự hy vọng python có một giải pháp đơn giản hơn.

Trả lời

13

Đặt dòng của bạn vào a_finder.py:

if OldVersion: 
    from my.package.location.A import A 
else: 
    from new.package.location.A import A 

Sau đó trong mã sản phẩm của bạn:

from a_finder import A 

và bạn sẽ nhận được A. đúng

+0

Đó chính xác là cách Python "hoạt động" :) –

1

Bạn có thể thực hiện một gói ở một số vị trí thứ ba để kiểm tra OldVersion và nhận A của chính nó từ đúng nơi, sau đó luôn nhập gói đó?

-2
from my.package.location.A import A as old 
from new.package.location.A import A as new 

somthing như thế?

old.someFunc() 
new.someFunc() 

tôi không hiểu điểm của câu hỏi.

+0

Tôi nghĩ bạn có thể rút lại câu trả lời của bạn nếu bạn không nhận được điểm ... – sage

+0

@sage Lol. 4 năm trước, tôi không thể bình luận vì không có đại diện. Vì vậy, tôi đăng nó như một câu trả lời để có thêm thông tin. – Jaxedin

2

Bạn có thể làm một cái gì đó như thế này:

AlwaysRightA.py

import sys 
if(OldVersion): 
    from my.package.location.A import A 
else: 
    from new.package.location.A import A 
sys.modules[__name__] = A 

Sau đó chỉ cần import AlwaysRightA as A và bạn thiết lập.