首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
宝塔
V2EX  ›  问与答

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

  •  
  •   SharkIng · 36 天前 · 957 次点击
    这是一个创建于 36 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    # 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

    有什么更好的办法么?

    第 1 条附言  ·  36 天前
    暂时用 `globals()` 和 `locals()` 解决了,看看有没有 bug
    13 回复  |  直到 2019-10-11 15:15:40 +08:00
        1
    maichael   36 天前
    这不是哈希表干的事么。
        2
    Sylv   36 天前 via iPhone
    provider_controller = globals[pro + "_controller"]
        3
    Sylv   36 天前 via iPhone   ♥ 1
    更正:
    provider_controller = globals()[pro + "_controller"]
        4
    wwqgtxx   36 天前   ♥ 1
    试一下 globals()和 locals()
        5
    SharkIng   36 天前
    @Sylv
    @wwqgtxx 谢谢
        6
    BingoXuan   36 天前
    函数内使用 locals 注入局部变量,这样不会污染到全局。作用域只在当前函数空间内。但如果全局设定有关可以用 globals 注入。楼上已经做了示范
        7
    SharkIng   36 天前
    @BingoXuan 谢谢,这样明白了
        8
    RHxW   36 天前
    eval()不可以嘛?
        9
    Fris   36 天前   ♥ 1
    换个思路,可以考虑一下使用 importlib 库
        10
    SharkIng   36 天前
    @Fris #9 谢谢,我试试

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

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

    但是因为代码过于臃肿复杂,本来想用相对 OO 一些的办法,但是实在有点爱莫能助
        13
    renmu   36 天前 via Android
    @SharkIng 用字典就可以了
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   864 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 21:03 · PVG 05:03 · LAX 13:03 · JFK 16:03
    ♥ Do have faith in what you're doing.