Python,以正确的方式进行条件导入
- 2025-04-10 09:44:00
- admin 原创
- 22
问题描述:
现在我有一门课叫 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)
有没有更简单的方法可以做到这一点?没有工厂层?这现在可以将我的类上的每个静态方法调用变成 2 行。我总是可以在类中保存一个引用以减少影响,但我真的希望 Python 有一个更简单的解决方案。
解决方案 1:
将您的行放入 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
操作就可以了。
解决方案 3:
您是否可以在第三个位置创建一个包,该包检查 OldVersion 并从正确的位置获取它自己的 A,然后始终导入该包?
解决方案 4:
处理过类似的案件
已转换
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 ')
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD