现在我有一堂课叫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 有一个更简单的解决方案。
将你的行放入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。
你可以这样做:
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
即可完成。
您能否在第三个位置创建一个包来检查 OldVersion 并从正确的位置获取它自己的 A,然后始终导入该包?
处理过类似的案例
转换
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 ')
from my.package.location.A import A as old
from new.package.location.A import A as new
类似这样的事情?
old.someFunc()
new.someFunc()
我没明白问题的重点。