17

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.

4 Answers 4

25

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.

Sign up to request clarification or add additional context in comments.

1 Comment

It is too old an answer, but. How do I pass the parameter OldVersion to the file a_finder?
2

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.

Comments

1

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?

Comments

0

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 ')

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.