2017-10-09 68 views
1

我已经有一个工作,但在我的oppinion不是一个长脚本的一部分美丽的解决方案。pythonic方法来调用方法取决于变量[解决方案:字典]

我的脚本使用了几种类似的方法,这些方法相差太远,无法合并。然而,我想根据给定的变量来调用其中一种方法。

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

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

现在我想调用这些方法在Python的方式,当信(A,B, C,...)作为变量给出。

非Python的的解决办法是:

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

,我希望能找到一个更Python的解决方案,让我简单地调用这些方法是这样的:

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

请记上面的代码只是我希望做的一个图像,这不是一个可行的例子!

我希望我说清楚我的问题,提前致谢!

+1

用字母作为键和方法创建一个字典作为值。 –

回答

2

我没有看到一个问题,只需使用

if var == 'A': 
    read_a() 

,但如果你想使之更“Python化”则可以将变量使用字典映射的方法和执行它的基础上的结果一个什么样的存储在你的字典里:

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' 
+0

该代码的确使用if来工作,但它需要很多,我想知道是否有办法以优雅的方式缩短它 – yfro

+0

希望这足够优雅,它应该减少你的代码行数,如果你有很多if语句 – AK47

1

棒的字典中的功能,并使用字典派遣到所选择的一个:

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

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

1

如果您有许多名为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 
+1

看起来很有趣。会试一试。谢谢! – yfro

1

你可以使用未来建设:

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

设置你的变量,而不是 '0' 和 '1' 或更多,并通过你向PARAMS execute_func()。

+1

既执行read_A又执行read_B,它只是返回所选内容的解决方案,您应该从字典中删除括号并将它们放在'} [x]' – Adirio

+0

后面,我很好奇它为什么会这样做。这真的有帮助 – yfro