Python 的变量有没有可能用一个 “固定 string” + “另一个变量组成”?

2019-10-11 08:54:32 +08:00
 SharkIng

具体文字不好表达,直接上例子吧

# 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_controllerprovider_account 两个固定名称的变量会被下面引用

运行例如 check_instance('aws') 的时候,要求 provider_controller 此时对应 import 的 aws_controllerprovider_account 对应数据库里面的 aws_account

也就是说在 pass in 不同的 string (名称) 的时候要求更改两个变量的实际调用

网上看了似乎有一个类似于 vars()["{}_controller".format(provider)] 的办法,在 python shell 里面似乎可用但是实际写在 code 里面的时候会提示 key error

有什么更好的办法么?

1655 次点击
所在节点    问与答
13 条回复
maichael
2019-10-11 08:58:36 +08:00
这不是哈希表干的事么。
Sylv
2019-10-11 09:04:37 +08:00
provider_controller = globals[pro + "_controller"]
Sylv
2019-10-11 09:05:07 +08:00
更正:
provider_controller = globals()[pro + "_controller"]
wwqgtxx
2019-10-11 09:12:22 +08:00
试一下 globals()和 locals()
SharkIng
2019-10-11 09:15:38 +08:00
@Sylv
@wwqgtxx 谢谢
BingoXuan
2019-10-11 09:19:56 +08:00
函数内使用 locals 注入局部变量,这样不会污染到全局。作用域只在当前函数空间内。但如果全局设定有关可以用 globals 注入。楼上已经做了示范
SharkIng
2019-10-11 09:23:21 +08:00
@BingoXuan 谢谢,这样明白了
RHxW
2019-10-11 09:51:00 +08:00
eval()不可以嘛?
Fris
2019-10-11 10:30:02 +08:00
换个思路,可以考虑一下使用 importlib 库
SharkIng
2019-10-11 12:30:26 +08:00
@Fris #9 谢谢,我试试

@RHxW #8 好像没办法满足需求
ClericPy
2019-10-11 12:44:28 +08:00
比较典型的那种工厂方法, 或者写个类把相关的注册进去多好, globals 什么的还是少用...
一般我的习惯其实更倾向于一堆 class 继承同一个基类, 用 `__init_subclass__ ` 或者直接在基类的 `__subclasses__()` 里面翻腾...

不过如果不靠谱太复杂, globals 最简单, 以前我在一个 model 里靠前缀收集函数时候爱这么做
SharkIng
2019-10-11 13:57:49 +08:00
@ClericPy #11 主要公司一个非常老的代码最近加一个新功能,我可以写无数个 if 来 check condition 然后 assign 不一样的 value,觉得那也太二了,一点逻辑都没有,想用以相对简短可行的办法

但是因为代码过于臃肿复杂,本来想用相对 OO 一些的办法,但是实在有点爱莫能助
renmu
2019-10-11 15:15:40 +08:00
@SharkIng 用字典就可以了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/608083

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX