2012-12-14 2 views
0

현재 프로그래밍을 공부하고 있는데 다음과 같은 문제가 있습니다.사용자가 자신의 기능을 선택하게하는 방법

사용자는 명령 줄에서 원하는 작업을 입력해야하며 작업에 따라 항목에 대한 정보를 입력해야합니다.

나는 다음과 같은 것들을 시도 :

def stock(f): 
    d={} 
    f() 
    return d 


def add(item,amount): 
    d[item]=amount 
    return d 

또는

def stock(item,amount,f): 
    d={} 
    if f(): 
     d[item]=amount 
    return d 


def add(): 
    return True 

을하고, 두 번째는 나를 위해 작동하지 않기 때문에, 내가 (A를이 코드 제거를 사용하고자 할 때, b) 나는 세 가지 주장을하지 않아도된다. 내가 말하고자하는 것은 내 작업에 따른 논쟁의 변화입니다. 어떻게 처리할까요?

+1

더 큰 그림을 설명해 주시겠습니까? 사용자가 함수로 전달할 수있는 것을 의미하는 것은 그 함수에 제공되어야하는 어딘가에서 입력됩니다 ... –

+0

사용자는 그가 원하는 작업을 명령 행에서 수행하기를 원하는대로 입력해야합니다. 그는 항목에 대한 정보를 입력해야합니다. – billwild

답변

1

, 당신은 사전에 공장 패턴을 필요

>>> class Calc(object): 
    def __init__(self): 
      #Initialize a dictionary of keywords and callbacks 
     self.operation = { 
      'add':self.add, 
      'sub':self.sub, 
      'mul':self.mul, 
      'div':self.div, 
      'neg':self.neg 

      } 
    #Overload the function call 
    def __call__(self, *args): 
     return self.operation[args[0]](*args[1:]) 
    # *args - variable list argument list 
    def add(self,*args): 
     return sum(args) 
    def sub(self,*args): 
     return args[1] - args[0] 
    def mul(self, *args): 
     if len(args) == 0: 
      return 1 
     elif len(args) == 1: 
      return args[0] 
     else: 
      return args[0] * args[1] 
    def div(self, *args): 
     return args[0]/args[1] 
    def neg(self, *args): 
     return -args[0] 


>>> calc = Calc() 
>>> calc('add',1,2,3) 
6 
>>> calc('mul',10) 
10 
>>> calc('mul',10,4) 
40 
>>> calc('neg',3) 
-3 
>>> 
+0

이것을 할 수있는 쉬운 방법이 있습니까? __init__ 또는 자기가 무엇인지 전혀 모릅니다. – billwild

+0

예, 클래스 외부에 배치하십시오. 그러나 전문성 수준을 알지 못하면 어떠한 해결책도 제시 할 수 없습니다. – Abhijit

+0

이것이 OP가 원하는 것과 가장 가까운 것 같아요 : dispatch-dict, 그러나 바인딩되지 않은 메소드들, 그리고 아마도 sys.argv [1]'에 대한 간단한 조회가 ... –

1

난 당신이 여기에가는 것을 정확하게 모르겠지만, 파이썬 코드에서 볼 수있는 일반적인 것은으로 정의 된 함수입니다 : 당신은 다음과 같이이 함수를 호출 할 수 있습니다

def foo(*args): 
    print(args) #args is a tuple 
    print(len(args)) #you can inspect it's length to see how foo should behave 

:

내가 제대로 이해하면
foo(1) 
foo(1,2) 
foo(1,2,3) 
foo(1,2,3,"spam") 

+0

"* args"는 무엇을 의미합니까 – billwild

+1

@billwild - 정확 하 게. 스크립트에 넣고 실행 해보십시오. 내가 말했듯이, 이것이 당신이하려고하는 것이거나 도움이되는지 확실하지 않습니다 ... (그렇지 않다면, 나는 행복하게 삭제할 것입니다). 하지만, 적어도 이것을 시도해야합니다 - 오늘 새로운 것을 배울 것입니다 :) – mgilson

+1

@billwild 파이썬에 대한 어떤 수준의 경험이 있습니까 (그리고 일반적으로 프로그래밍입니까?) –

관련 문제