【问题标题】:Calling a function complete with arguments using a dictionary in python3使用python3中的字典调用带有参数的函数
【发布时间】:2020-02-07 08:57:08
【问题描述】:

我一直在逐步改进调用函数的方法,其中包含字典中保存的参数列表。我的问题在于参数是命令行参数,并且函数具有不同数量的参数。如果我调用一个有 2 个参数的函数,但字典也有一个有 3 个参数的函数,那么我会在字典中的那个条目上得到一个“IndexError:list index out of range”。我的代码是

!/usr/bin/env python

from sys import argv



def func1(num1, num2):
    result = int(num1) + int(num2)
    print('The sum of {0} and {1} is {2}'.format(num1, num2, result))

def func2(num1, num2, num3):
    result = (int(num1) + int(num2) + int(num3)) / 3
    print('The average of {0} {1} and {2} is {3}'.format(num1, num2, num3, result))

def func3(string1):
    reverse = string1[::-1]
    print('{0} reversed is {1}'.format(string1, reverse))

def func4(*args):
    pass

def func5(*args):
    pass



def main():
    option = {
        'f1': func1(argv[2], argv[3]),
        'f2': func2(argv[2], argv[3], argv[4]),
        'f3': func3(argv[2])
        }

    if len(argv) > 1:
        for routine in option:
            if routine == argv[1]:
                option[routine]()
                exit(0)



if __name__ == '__main__':
    main()

我在 linux 系统上,所以如果我执行 ./program.py f1 10 11
它确实给出了预期的结果,但在提到 f2 的字典条目中抛出了说 IndexError。我可以将函数和参数的字典条目转换为字符串并使用 eval 但这显然不安全,但它确实消除了错误。所以我收集 python 正在将字典条目解释为命令并抛出错误。从上面的代码中,有没有人想办法解决这个问题?

【问题讨论】:

    标签: python-3.x function dictionary arguments


    【解决方案1】:

    当你的代码被执行时,首先它正在构建你的字典,在那里你可以看到所有的函数都被调用了,因为我可以假设这不是你的预期行为,你想根据行参数调用一个函数,所以你不应该在你的字典中调用你的函数,而只能在你检查第二行参数之后:

     option ={
         'f1': (func1, slice(2, 4)),
         'f2': (func2, slice(2, 5)),
         'f3': (func3, slice(2, 3))
     }
    
    if len(argv) > 1 and argv[1] in options:
        my_function, slice_argv = options[argv[1]][0]
        my_function(*argv[slice_argv])
    

    如果你确定你会为你想要的函数提供正确数量的行参数,你可以使用:

     option ={
         'f1': func1,
         'f2': func2,
         'f3': func3
     }
    
    if len(argv) > 1 and argv[1] in options:
        my_function[argv[1]](*argv[2:])
    

    【讨论】:

    • 感谢您的回复。作为 Python 新手(但不是编程新手),我花了几秒钟的时间来理解它是如何工作的。在我的例子中,每个函数都有一个已知且固定数量的参数,因此引用的第二个选项是我的实例的选项,并且可以作为一种享受。第一个选项我仍在努力解决问题,但没有什么实验无济于事;)。现在只要我知道如何标记这个解决了
    猜你喜欢
    • 2017-06-03
    • 2017-09-04
    • 1970-01-01
    • 2017-11-02
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多