2010-12-08 17 views
0

나는 모든 주어진 데이터를 취하고 그걸로 할 수있는 모든 것을하는 나의 물리 챕터의 문제를 해결하는 프로그램을 작성했다. 나는 어떤 함수가 호출하기에 안전한지를 확인하기 위해 긴 문장의 if 문을 사용했다. (함수 자체는 안전하지 않다.)하지만 더 좋은 방법이 있어야한다.입력에 따라 파이썬의 다른 함수들

전체 코드 (기본값은 없음입니다 argparse) here

여기 가해자의 조각입니다입니다 :

# 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

여기에서 코드를 가져 오십시오. 도움이됩니다. – pyfunc

+0

"안전"? "안전하지 않음"? 너 무슨 뜻이야? –

+0

나는 그가 예외를 던지는 것을 의미한다고 생각한다. – marr75

답변

1

프로그램의 디자인을 감안할 때, 당신이하고 싶은 것을 구현하는 방법이 그리 좋지 않다는 것을 알았습니다. 그러나 당신 프로그램의 디자인에는 뭔가 비린내가 있다고 생각합니다.

내가 올바르게 이해하면 사용자는 원하는만큼 많은 인수를 전달할 수 있고 어떤 인수가 정의되었는지에 따라 모든 기능을 호출 할 수 있습니다. 왜 모든 인수가 전달되거나 호출시 함수의 이름 중 하나가 필요합니까? 이 디자인을 고집하는 경우


당신은 다음 시도 할 수 :

  • 기능의 dict 만들기 -> 필요한 인수 다음 DICT 이상

    {find_velocity: ("t", "ld"), ...} 
    
  • 루프 각 속성이 있는지 확인하십시오 :

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

왜냐하면 다양한 기능에 대해 일관된 이름 지정 방법을 생각할 수 없었기 때문입니다. 옵션 목록을 통해 반복 할 수 있지만 터미널의 도구로서 많은 힘을 잃습니다. 각 질문마다 모든 변수가 포함되는 것은 아니기 때문에 모든 주장을 요구하고 싶지는 않습니다. –

+0

@ 노나 : 글쎄, 코드를 조금 깔끔하게 수정하는 방법을 참고하십시오. – katrielalex

0

함수를 호출 한 다음 일부 인수로 전달하려는 것처럼 보입니다. 이 경우에는 argparse가 전혀 필요하지 않을 수도 있습니다. 대신 첫 번째 명령 줄 인수가 될 함수를 만든 다음 다른 모든 인수를 해당 함수의 인수로 사용하십시오.

sys.argv[1]으로 첫 번째 인수에 액세스하고 sys.argv[2:]으로 다른 모든 인수에 액세스 할 수 있습니다. 당신의 기능은 로컬 모듈에 정의되어 가정

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

:

그럼 당신은 이런 식으로 함수를 호출 할 수 있습니다.

3

함수를 목록에 넣은 다음 해당 함수의 각 변수 이름에 해당 인수가 없음을 확인하여 해당 목록을 필터링하십시오.

예 :

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 

는 그냥 인터프리터에 어디서나, 난 단지 노력 부품을 엉망 있으면 알려 주시기, 구문에 석탄을 통해 저를 잡지 마십시오.

+0

나는 katrie b/c s/he를 먼저 받아 들였지만 당신의 대답은 또한 매우 도움이되었다. 감사! –

관련 문제