Nano Hash - криптовалюты, майнинг, программирование

Python: использование *args, **kwargs в функциях-оболочках

Я пишу функцию-оболочку для Django render_to_response(), чтобы добавить обработку CSRF.

Логика такова:

def some_view (request)
    dictionary = {'context_param': some_param}
    dictionary.update(csrf(request))
    # ... view code here
    return render_to_response("a_template.html", dictionary)

render_to_response() имеет следующую подпись:

def render_to_response(*args, **kwargs)

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

def csrf_response (request, *args, **kwargs):

    # Here I need to somehow extract dictionary from args or kwargs

    if dictionary is None:
        dictionary = {}
    dictionary.update(csrf(request))

    # And here I somehow need to pass dictionary into render_to_response() fot the furher processing
    return render_to_response(*args, **kwargs)

Итак, вопрос: как лучше всего извлечь необходимый параметр из args/kwargs (затем изменить его) и передать дальше?

Кстати, код render_to_response() показался мне немного странным. Вот:

def render_to_response(*args, **kwargs):
    """
    Returns a HttpResponse whose content is filled with the result of calling
    django.template.loader.render_to_string() with the passed arguments.
    """
    httpresponse_kwargs = {'mimetype': kwargs.pop('mimetype', None)}
    return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)

Что, если кто-то вызовет его со всеми позиционными аргументами, поэтому kwargs будет пустым, но параметр mimetype будет указан как последний позиционный аргумент? Похоже, в этом случае его поведение было бы неправильным.


Ответы:


1

Из-за того, как реализован render_to_response, единственный способ указать mimetype — использовать именованный аргумент. Все, что передается в качестве позиционного аргумента, будет передано в loader.render_to_string.

Методология извлечения одних аргументов и передачи других действительно зависит от того, что вы делаете. Не существует одного «правильного» способа делать это всегда. Естественно, у разных авторов есть свои предпочтительные условности.

Вместо вашего комментария # Here I need to somehow extract dictionary from args or kwargs вы можете использовать kwargs непосредственно как словарь, а args как кортеж, потому что это именно то, чем они являются. Что касается аргументов, у вас нет другого выбора, кроме как утверждать (т. е. предполагать) значение значения в каждой позиции.

Я лично предпочитаю, чтобы если вы пишете код, который знает значения определенных аргументов, они должны быть объявлены в подписи, например так:

def spam(session, name, *args, clear=True, **kwargs):
  # do something with session, name, clear
  return eggs(name, *args, **kwargs)  # if eggs requires name
09.05.2011
  • вы можете использовать kwargs напрямую как словарь - словарь не является Python dict - это необязательный параметр функции render_to_response(), которая описана в документации следующим образом: render_to_response(template[, dictionary][, context_instance][, mimetype]) 09.05.2011
  • О, кажется, теперь я вижу. Я написал свою собственную функцию filterkeys, которая возвращает новый словарь, содержащий только те ключи, которые я хочу сохранить, на основе логической функции. Используя что-то подобное, вы можете фильтровать kwargs, а затем передавать его внутренней функции. 09.05.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..