具体文字不好表达,直接上例子吧
# 2-3 个内部的 .py module, 调用官方 Library, 例如以下 AWS 和 GCP 的
# 每个 module 命名均为 "服务商代号_controller", 且内部 method 都一样
import aws_controller
import gcp_controller
# main.py 中通过不同 provier 名字控制
def check_instances(pro):
provider_controller = `pro` + "_controller"
provider_account = `pro` + "_account"
instances = provider_controller.check(provider_account)
return instances
上面例子中 provider_controller
和 provider_account
两个固定名称的变量会被下面引用
运行例如 check_instance('aws')
的时候,要求 provider_controller
此时对应 import 的 aws_controller
且 provider_account
对应数据库里面的 aws_account
也就是说在 pass in 不同的 string (名称) 的时候要求更改两个变量的实际调用
网上看了似乎有一个类似于 vars()["{}_controller".format(provider)]
的办法,在 python shell 里面似乎可用但是实际写在 code 里面的时候会提示 key error
有什么更好的办法么?
1
maichael 2019-10-11 08:58:36 +08:00
这不是哈希表干的事么。
|
2
Sylv 2019-10-11 09:04:37 +08:00 via iPhone
provider_controller = globals[pro + "_controller"]
|
3
Sylv 2019-10-11 09:05:07 +08:00 via iPhone 1
更正:
provider_controller = globals()[pro + "_controller"] |
4
wwqgtxx 2019-10-11 09:12:22 +08:00 1
试一下 globals()和 locals()
|
6
BingoXuan 2019-10-11 09:19:56 +08:00
函数内使用 locals 注入局部变量,这样不会污染到全局。作用域只在当前函数空间内。但如果全局设定有关可以用 globals 注入。楼上已经做了示范
|
8
RHxW 2019-10-11 09:51:00 +08:00
eval()不可以嘛?
|
9
Fris 2019-10-11 10:30:02 +08:00 1
换个思路,可以考虑一下使用 importlib 库
|
11
ClericPy 2019-10-11 12:44:28 +08:00
比较典型的那种工厂方法, 或者写个类把相关的注册进去多好, globals 什么的还是少用...
一般我的习惯其实更倾向于一堆 class 继承同一个基类, 用 `__init_subclass__ ` 或者直接在基类的 `__subclasses__()` 里面翻腾... 不过如果不靠谱太复杂, globals 最简单, 以前我在一个 model 里靠前缀收集函数时候爱这么做 |