【问题标题】:Way to call method depending on variable?根据变量调用方法的方式?
【发布时间】:2017-10-09 13:53:51
【问题描述】:

我已经有了一个可行的解决方案,但我认为对于长脚本的一部分来说不是很好的解决方案。

我的脚本使用了几种类似的方法,它们差别太大而无法组合。但是,我想根据给定的变量调用其中一种方法。

方法的名称是这样建立的:

def read_A():
    #doing sth
def read_B():
    #doing sth else
def read_C():

等等

现在我想以 Python 的方式调用这些方法,将字母 ('A', 'B', 'C', ...) 作为变量给出。

非pythonic的解决方案是:

if var == "A":
    read_A()
if var == "B":
    read_B() .....

我希望找到一个更 Pythonic 的解决方案,让我可以像这样简单地调用这些方法:

var = "A"
read_var()      #This would call the method 'read_A()'

请注意,上面的代码只是我希望做的一个图像,它不是一个工作示例!

【问题讨论】:

  • 创建一个以字母为键、方法为值的字典。

标签: python variables dictionary methods


【解决方案1】:

我没有看到仅使用的问题

if var == 'A':
    read_a()

但如果您想让它更“pythonic”,您可以使用字典将变量映射到方法并根据字典中存储的结果执行它:

def read_a():
    print('Running method read_a')

def read_b():
    print('Running method read_b')

switch = {'A': read_a, 'B': read_b}

case = 'A'
switch.get(case)()
>> 'Running method read_a'
case = 'B'
switch.get(case)()
>> 'Running method read_b'

【讨论】:

  • 该代码确实可以通过使用 if 来工作,但它需要很多,我想知道是否有办法以优雅的方式缩短它
  • 希望这足够优雅,如果你有很多 if 语句,它应该会减少你的代码行数
【解决方案2】:

把函数粘在字典里,用字典分派给选中的那个:

read = {'A': read_a, 'B': read_b, 'C': read_c}
choice = 'A'
read[choice]()

在最后一行,您在字典中查找与您的选择相匹配的函数,然后立即调用它。

【讨论】:

    【解决方案3】:

    你可以使用下一个构造:

    def execute_func(x):
        return {
            '0':read_A(),
            '1':read_B()
        }[x]
    

    将变量设置为“0”和“1”或更多,并将参数传递给 execute_func()。

    【讨论】:

    • 执行 read_A 和 read_B 并且只返回所选的解决方案,您应该从 dict 中删除括号并将它们放在 }[x] 之后
    • 我试过了,很好奇为什么会这样。这真的很有帮助
    【解决方案4】:

    如果您有许多名为 read_a、read_b...等的函数,您可以这样做,而不是编写庞大的字典。

    def read_a():
        print('Running method read_a')
    
    def read_b():
        print('Running method read_b')
    
    def read_c():
        print("running method read_c")
    
    def read_d():
        print("running method read_d")
    
    ............
    ............
    
    def read_z():
       print("running method read_z")
    
    def _read_var(var):
        method = "read_{}".format(var.lower())
        try:
            eval(method)()
        except NameError:
            raise NotImplementedError
    
    var = "A"
    _read_var(var)# will invoke read_a method
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2019-12-23
      • 1970-01-01
      • 2016-12-26
      相关资源
      最近更新 更多