используя аргументы декоратора для переключения - PullRequest
0 голосов
/ 23 ноября 2018

В библиотеке flaks мы можем использовать декоратор как переключатель.(Я хорошо понял?)

app.route('')

Итак ... Я хотел бы сделать несколько операторов switch с декораторами и аргументами,

вроде:

@color('pink')
def _pink_power(self):
    print("wow")

@color('blue')
@color('red')
def _powerpower(self):
    print("god!!!!")

def input(color):
    I don't know what to do in here..
    if color is pink, print wow!

Я пытался понять это довольно долго, но я не мог этого сделать.Вы думаете, это невозможно?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Вот относительно простой способ сделать это (хотя я рекомендую в конце изменить имя функции input, потому что она конфликтует со встроенным с тем же именем):

class color:
    _func_map = {}

    def __init__(self, case):
        self.case = case

    def __call__(self, f):
        self._func_map[self.case] = f
        return f

    @classmethod
    def switch(cls, case):
        cls._func_map[case]()


@color('pink')
def _pink_power():
    print("wow")

@color('blue')
@color('red')
def _powerpower():
    print("god!!!!")


def input(colorname):
    color.switch(colorname)

input('pink') # -> wow
input('blue') # -> god!!!!
input('red')  # -> god!!!!

Улучшение

Вы можете поддерживать регистр по умолчанию, такой как поддержка операторов switch в C / C ++, который будет использоваться при отсутствии соответствия colorname:

class color:
    DEFAULT = '_DEFAULT'
    def _default(): raise ValueError('Unknown color!')

    _func_map = {DEFAULT: _default}

    def __init__(self, case):
        self.case = case

    def __call__(self, f):
        self._func_map[self.case] = f
        return f

    @classmethod
    def switch(cls, case):
        cls._func_map.get(case, cls._func_map[cls.DEFAULT])()

Метод _default(), добавленный в класс, вызывает исключение при его вызове:

input('lavender')  # -> ValueError: Unknown color!

Однако вы можете переопределить это, определив свой собственный:

@color(color.DEFAULT)  # Define custom color default.
def my_default():
    print("loser!")

input('lavender')  # -> loser!
0 голосов
/ 23 ноября 2018

Ты ... мог бы сделать это, но я не уверен, что это хорошая идея.

import contextlib

class Colors(object):
    def __init__(self):
        self.__colors = dict()

    def register(self, colorname):
        def wrapper(f):
            @contextlib.wraps(f)
            def wrapper(*args, **kwargs):
                return f(*args, **kwargs)
            self.__colors[colorname] = wrapper
            return wrapper

    def __getitem__(self, item):
        return self.__colors[item]

colors = Colors()

@colors.register("pink")
def _pink_power():
    print("wow")

@colors.register("blue")
@colors.register("red")
def _powerpurple():
    print("god!!!!!")

def input(colorname):
    colors[colorname]()
...