Reputation: 231
Right now I have a class called A.
I have some code like this..
from my.package.location.A import A
...
foo = A.doSomething(bar)
This is great.
But now I have a new version of A called A, but in a different package, but I only want to use this other A in a certain scenario. So I can do something like this:
if(OldVersion):
from my.package.location.A import A
else:
from new.package.location.A import A
...
foo = A.doSomething(bar)
This works fine. But it is ugly. How can I do this better? I really want to do something like this
from my.abstraction.layer.AFactory import AFactory
...
myA = AFactory.giveMeA() # this looks at "OldVersion" and gives me the correct A
foo = myA.doSomething(bar)
is there a way I can do that easier? Without the factory layer? This now can turn every static method call on my class into 2 lines. I can always hold a reference in a class to reduce the impact, but im really hoping python has a simpler solution.
Upvotes: 16
Views: 19247
Reputation: 379
handled a similar case like this
converted
if next_args['current_branch'] == "first_request":
from .first_request import upload_data
elif next_args['current_branch'] == "get_address":
from .get_address import upload_data
elif next_args['current_branch'] == "final_request":
from .final_request import upload_data
else:
raise ValueError(f'invalid value in postscript {next_args["current_branch"]}')
return upload_data(oc, next_args)
to
def process_data(self) -> str:
branch_mapping = {
"first_request": ".first_request",
"get_address": ".get_address",
"final_request": ".final_request"
}
current_branch = self['current_branch']
if current_branch in branch_mapping:
module_name = branch_mapping[current_branch]
upload_data = __import__(module_name, fromlist=['upload_data'])
upload_data.upload_data()
else:
raise ValueError('Invalid value ')
Upvotes: 0
Reputation: 375504
Put your lines into a_finder.py:
if OldVersion:
from my.package.location.A import A
else:
from new.package.location.A import A
Then in your product code:
from a_finder import A
and you will get the proper A.
Upvotes: 24
Reputation: 48775
You could do something like this:
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
Then simply import AlwaysRightA as A
and you're set.
Upvotes: 2
Reputation: 2900
Could you just make a package in some third location that checks OldVersion and gets it's own A from the right place, then always import that package?
Upvotes: 1