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

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

  •  
  •   SharkIng · 2019-10-11 08:54:32 +08:00 · 1662 次点击
    这是一个创建于 1877 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    但是因为代码过于臃肿复杂,本来想用相对 OO 一些的办法,但是实在有点爱莫能助
    renmu
        13
    renmu  
       2019-10-11 15:15:40 +08:00 via Android
    @SharkIng 用字典就可以了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2012 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:53 · PVG 08:53 · LAX 16:53 · JFK 19:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.