Python,以正确的方式进行条件导入

问题描述 投票:0回答:5

现在我有一堂课叫A。

我有一些这样的代码..

from my.package.location.A import A

...


foo = A.doSomething(bar)

这太棒了。

但是现在我有一个名为 A 的新版本 A,但在不同的包中,但我只想在特定场景中使用另一个 A。所以我可以做这样的事情:

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

...

foo = A.doSomething(bar)

这个效果很好。但它很丑。我怎样才能做得更好?我真的很想做这样的事情

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

有什么方法可以让我更轻松地做到这一点吗?没有工厂层?现在,这可以将我的类上的每个静态方法调用变成两行。我总是可以在类中保留一个引用来减少影响,但我真的希望 python 有一个更简单的解决方案。

python import conditional-statements factory-pattern
5个回答
22
投票

将你的行放入a_finder.py:

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

然后在您的产品代码中:

from a_finder import A

您将获得正确的 A。


2
投票

你可以这样做:

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

然后只需

import AlwaysRightA as A
即可完成。


1
投票

您能否在第三个位置创建一个包来检查 OldVersion 并从正确的位置获取它自己的 A,然后始终导入该包?


0
投票

处理过类似的案例

转换

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)

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

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

类似这样的事情?

old.someFunc()
new.someFunc()

我没明白问题的重点。

© www.soinside.com 2019 - 2024. All rights reserved.