根据输入的Python不同的功能

我写了一个程序来解决我的物理章这需要所有给定的数据,并做一切可能与它的问题。 我用if语句的长字符串来检查哪些功能是安全地调用(函数本身不是安全的),但我觉得必须有一个更好的方式来做到这一点。

完整的代码是在这里

这里是罪犯的一个片段(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)

谢谢!

--------------解决方案-------------

鉴于你的程序的设计,你已经找到实现你想要做的不是太糟糕的方式。 但是,我认为有可疑的东西与你的程序的设计。

要是我理解正确的话,你允许用户传递尽可能多或尽可能少论据,他/她希望,然后调用所有这一切使定哪些参数定义意义上的功能。 为什么不要求要么所有的参数传递或功能之一被命名的电话吗?



如果你坚持这样的设计,你可以尝试以下方法:

  • 做一个dict的功能- >必需的参数:

    {find_velocity: ("t", "ld"), ...}
  • 遍历字典,检查是否有每个属性:

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

把功能列表中,然后过滤列表确保在该函数的每个变量名的参数不是没有。

例:

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

请不要把我在语法上的煤,只是让我知道,如果我搞砸了它的任何地方,我只试了部分的解释。

好像你要调用一个函数,然后通过它的一些参数。 在这种情况下,你可能不需要argparse的。 取而代之尝试使你想成为第一个命令行参数的函数,然后采取一切作为参数传递给这个函数。

您可以访问的第一个带有参数sys.argv[1]并与所有其他参数sys.argv[2:]

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

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

假设你的函数的局部模块中的定义。

分类:蟒蛇 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.561 (s). 10 q(s)