Django / Python API - как узнать, какой класс объекта ожидает получить метод? - PullRequest
0 голосов
/ 17 января 2012

Я просто потратил два часа на отладку некоторого кода на django, потому что, по моему мнению, API не был понятен.Вот что говорит документация Django о методе render: https://docs.djangoproject.com/en/1.3/topics/http/shortcuts/#render

render (запрос, шаблон [, словарь] [, context_instance] [, content_type] [, status] [, current_app])

Объединяет данный шаблон с заданным контекстным словарем и возвращает объект HttpResponse с этим отображаемым текстом.

render () аналогично вызову render_to_response () с аргументом context_instanceэто заставляет использовать RequestContext.

Теперь, увидев, что второй аргумент, который ожидает метод рендеринга, является шаблоном, я передал ему объект Template.Оказывается, что метод действительно хочет это имя шаблона, заданное как String.Откуда мне это знать?А что такое «статус» - целое число?строка?Статус объекта?список?Где можно получить ясную документацию, на которую можно сослаться?

Кроме того, мне бы очень хотелось найти IDE, которая может обнаруживать подобные вещи во время программирования - когда я работал с Netbeans и Java, такого рода ошибкиредактор поймал бы его с волнистым красным подчеркиванием, прежде чем я даже начал печатать следующую строку кода.

Ответы [ 2 ]

8 голосов
/ 17 января 2012

Я вообще не могу понять, как это можно объяснить лучше. Как указывает Мику в комментарии, в документации четко указано «полное название шаблона для использования». Кроме того, пример, приведенный ниже, показывает использование строки.

Python не является ни Java, ни каким-либо статически типизированным языком. Документация не говорит, что она хочет строку, потому что это не так: она хочет что-то похожее на строку, содержащее имя.

И не забывайте, у вас есть немедленный доступ к коду. Не понимаю функцию? Ну, посмотрите на https://code.djangoproject.com/browser/django/trunk/django/shortcuts/__init__.py и вот оно.

Еще лучше, в Python у вас есть опция, которой у вас просто нет в Java: посмотрите в оболочке. Сделайте from django.shortcuts import render, затем help(render), чтобы увидеть, что он говорит, и, если это не поможет, попробуйте вызвать его с несколькими различными аргументами, чтобы увидеть, что он делает.

Если вы будете настаивать на программировании на Python, как на Java, вам будет сложно. Если вы программируете Python как Python, вы найдете его намного проще.

2 голосов
/ 17 января 2012

Хотя я согласен с ответом Даниэля Роземана, я сочувствую вашему недоумению и думаю, что интерфейс и его параметры можно было бы объяснить лучше.

Интерфейс Django очень привержен идее динамической типизацииили « утка печатает » - например, если она ходит как утка, если она плавает как утка, то назовите ее уткой.Интерфейс Django не требует, чтобы вы передавали строковый тип, он требует, чтобы вы передавали сущность, которая ведет себя как строка.

Внимательно посмотрите в документации, на которую вы ссылались, конкретную формулировку для каждого параметра render(). запрос - это «запрос объект ». шаблон - это "полное имя ... или последовательность из имен ." словарь - это " словарь значений ...". status - это «код состояния для ответа. По умолчанию 200 » [целое число].

Я добавил акцент на слова, которые намекают на то, какой динамический тип интерфейс ожидает или возвращает. объект означает тип объекта с набором методов. name подразумевает строку.Пример 200 подразумевает, что код состояния является целым числом.

Я думаю, что документация Django была бы более понятной, если бы она была более явной в отношении своего словаря динамических типов, которые он ожидает или возвращает.Он может сказать что-то вроде: « запрос - это объект, реализующий интерфейс объекта запроса», а затем точно определить, какие методы нужно реализовать объекту, чтобы квалифицировать его как этот интерфейс.Документация также может быть явной, а не неявной в таких случаях, как status , где она может буквально сказать «целое число».

Но, за исключением этих предостережений, интерфейс Django спроектирован как «pythonic»,принять утки печатать.Даниэль прав: «Если вы будете настаивать на программировании на Python, как на Java, вам будет трудно».Это может быть хорошее время для прочтения Философии дизайна Джанго и PEP 20 Python - Дзен Питона .Обратите внимание, что ни один из них не упоминает «проверку синтаксиса во время компиляции благодаря строгой типизации» в качестве цели.Тото, я не думаю, что мы больше на Яве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...