Перегрузка функции / выбор версии на основе ввода. - PullRequest
0 голосов
/ 17 декабря 2018

Быстрый вопрос ко всем участникам.Как пример, возможно ли, возможно, с помощью декораторов и т. Д. Достичь чего-то подобного?

if input == 'X': 
  #only use the 'X' versions 
elif input == 'Y' 
  #only use the 'Y' versions
else: # Error out


def printer():
  print("X")

def returner():
  print("X")

def printer():
  print("Y")

def returner():
  print("Y")

Я попытался определить конкретные декораторы, которые присоединяются к каждой функции, такие как:

input = 'X'

try:
  if input == 'X': 
    def x(func):
      def wrapper(*args, **kwargs):
        func(*args, **kwargs)
      return wrapper
  elif input == 'Y': 
    def y(func):
      def wrapper(*args, **kwargs):
        func(*args, **kwargs)
      return wrapper
  else: # Error out
    pass
except NameError as e:
  pass

@x
def printer():
  print("X")

@x
def returner():
  print("X")

@y
def printer():
  print("Y")

@y
def returner():
  print("Y")

Любая помощь / помощь будет принята с благодарностью.Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Если я понимаю ваш вопрос, то, что вы хотите, это:

def printer_x():
  print("X")

def returner_x():
  print("X")

def printer_y():
  print("Y")

def returner_y():
  print("Y")

dispatch_dict = {'X' : (printer_x,returner_x), 
                 'Y' : (printer_y, returner_y)}

сейчас, вы можете сделать это:

printer,returner = dispatch_dict[input_val]
0 голосов
/ 17 декабря 2018

Просто определите сами функции в блоках if:

if input == 'X': 
    def printer():
        print("X")

    def returner():
        print("X")
elif input == 'Y' 

    def printer():
      print("Y")

    def returner():
      print("Y")

else: # Error out]

В вашем исходном коде не было «версий» функций;Версии Y заменили версии X, как только они были определены.

Или вы можете определить функцию, которая делает printer и returner на основе ее ввода:

def maker(arg):
    if arg not in ["X", "Y"]:
        raise ValueError()

    def printer():
        print(arg)

    def returner():
        print(arg)

    return printer, returner

printer, returner = maker(input)
...