我编写了一个程序来解决我的物理章节的问题,该章节采用了所有给定的数据并尽一切可能。我使用了一长串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)
谢谢!
答案 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:])
假设您的功能是在本地模块中定义的。