Python根据输入不同的功能

时间:2010-12-08 18:13:48

标签: python arguments switch-statement exists

我编写了一个程序来解决我的物理章节的问题,该章节采用了所有给定的数据并尽一切可能。我使用了一长串if语句来检查哪些函数可以安全地调用(函数本身并不安全),但我觉得必须有更好的方法来执行此操作。

完整代码为here

以下是罪犯的片段(argparse默认为无):

# EVALUATE:
if args.t and args.ld:
    print 'Velocity:', find_velocity(args.t, args.ld)
if args.t and args.l and args.m:
    print 'Velocity:', find_velocity(args.t, args.l, args.m)
if args.l:
    print 'Longest possible standing wave length:', find_longest_possible_standing_wave_length(args.l)
if args.l and args.m and args.t and args.n:
    print 'Frequency of the standing wave with', args.n, 'nodes:', find_nth_frequency_standing_wave(args.t, args.n, args.l, args.m)
if args.s and args.t and args.n and args.l:
    print 'Frequency of', args.n, 'standing wave:', find_nth_frequency_standing_wave(args.t, args.n, args.l, velocity=args.s)
if args.ld and args.t and args.f:
    print 'Angular wave number: ', find_angular_wave_number(args.ld, args.t, args.f)
if args.p:
    print 'Difference in amplitude of twins:', find_amplitude_difference_of_twins(args.p)
if args.f:
    print 'Angular wave frequency:',  find_angular_wave_frequency(args.f)

谢谢!

3 个答案:

答案 0 :(得分:3)

将函数放在一个列表中,然后过滤该列表,确保对于该函数中的每个变量名,这些参数不是none。

示例:

def func_filter(item, arguments):
    needed_args = item.func_code.co_varnames
    all(map(lambda x: getattr(arguments, x) , needed_args))

funcs = (find_velocity, find_nth_frequency_standing_wave)
funcs = filter(lambda x: func_filter(x, args), funcs)
#now execute all of the remaining funcs with the necessary arguments,
#similar to code in func filter

请不要因为语法问我煤炭,只要告诉我是否在任何地方搞砸了,我只在解释器上尝试了部分内容。

答案 1 :(得分:1)

鉴于您的程序设计,您已经找到了一种实现您想要做的事情的非常糟糕的方式。但是我觉得你的程序设计有点可疑。

如果我理解正确,你允许用户按照他/她的意愿传递尽可能多的参数,然后调用所有给定哪些参数定义的函数。为什么不要求传递所有参数或者要调用其中一个函数?


如果您坚持使用此设计,可以尝试以下方法:

  • 制作dict的功能 - >必需参数:

    {find_velocity: ("t", "ld"), ...}
    
  • 循环显示dict并检查您是否拥有每个属性:

    for func, reqs in funcs.items():
        args = [getattr(args, req) for req in reqs]
        if all(args):
            func(*args)
    

答案 2 :(得分:0)

好像你想调用一个函数然后在一些参数中传递它。在这种情况下,您可能根本不需要argparse。而是尝试将您想要的函数作为第一个命令行参数,然后将其他所有内容作为该函数的参数。

您可以使用sys.argv[1]访问第一个参数,使用sys.argv[2:]访问所有其他参数。

然后你可以这样调用这个函数:

locals()[sys.argv[1]](*sys.argv[2:])

假设您的功能是在本地模块中定义的。