Заранее примените функцию с аргументами целевой функции и получите возвращаемые результаты для применения к этой целевой функции

#python #flask #rabbitmq

#python #flask #rabbitmq

Вопрос:

Теперь я обновил этот пост фактическим сценарием, который я пытаюсь решить. Я использую Flask для создания RESTful api с flask-restful плагином и pika библиотекой для работы RabbitMQ . Например, этот фрагмент кода иллюстрирует запрос RPC на авторизацию с использованием информации о разрешении пользователя и токене предъявителя.

     def request_authz(self, metadata):
        """
        For an RPC request, the RCP client sends a message with two
        properties (i.e. `reply_to` and `correlation_id`) set to its
        callback queue
        """
        self.response = None
        self.correlation_id = str(uuid.uuid4())

        props = pika.BasicProperties(reply_to=self.callback_queue,
                                     correlation_id=self.correlation_id)

        self.channel.basic_publish(exchange=AMQP_EXCHANGE,
                                   routing_key=BINDING_STATISTICS,
                                   body=json.loads(s=metadata),
                                   properties=props)

        while self.response is None:
            self.conn_broker.process_data_events()
        return self.response
  

И этот фрагмент кода иллюстрирует POST конечную точку API для доступа к ресурсам после утверждения авторизации, хотя она еще не реализована. Это metadata должны быть параметры, полученные из этого request .

     def post(self):
        items = info(args=request.get_json()['params'])
        return {'data': items}
  

Я хочу убедиться, что все api должны быть авторизованы через request_authz . Другими словами, все api должны быть response возвращены, request_authz что указывает, авторизован он или нет. Как это сделать по-питоновски (например, с помощью декоратора)?

Комментарии:

1. Вы можете использовать if value > 0 , или есть какая-то причина, по которой вы пытаетесь избежать этого? Если вам нужна отдельная функция, сократите код до return value > 0 . Другая область упрощения заключается в том, что func1 и func2 , похоже, делают то же самое, только с разными операторами печати. Есть о чем подумать.

Ответ №1:

Вы могли бы сообщить print s одной функции:

 def util(value):
    if value > 0:
        return True
    else:
        return False

def check_value(value, value_type):
    if util(value):
        print('%s is %s' % (value_type, str(value)))
    else:
        print('%s must be positive' % value_type)

def func1(value):
    check_value(value, 'perimeter')

def func2(value):
    check_value(value, 'area')
  

Более того, util функция может быть сведена к:

 def util(value):
    return value > 0
  

Комментарии:

1. Извините, я обновил этот пост для фактического сценария. Но я надеюсь, что на этот раз я задам свой вопрос :).

Ответ №2:

Функция util может быть сведена к

 def util (value):
    return value > 0
  

Возврат будет таким же. В оригинале вы говорите

 if value > 0:#If condition is true return True, if not return False
    return True
else:
    return False
  

Проще просто вернуть результат сопоставления