Зависимости.На загрузке модулей для использования в функции или классе, руководить мной? - PullRequest
1 голос
/ 29 июня 2011

Я пробираюсь через несколько примеров и пришел с этим рабочим ответом - задача, поставленная в doctests:

def remove(sub, s):
    """
      >>> remove('an', 'banana')
      'bana'
      >>> remove('cyc', 'bicycle')
      'bile'
      >>> remove('iss', 'Mississippi')
      'Missippi'
      >>> remove('egg', 'bicycle')
      'bicycle'
    """
    if sub not in s: return s # 1
    from string import replace # 2
    return replace( s, sub, '', 1) # 3

Как PyNoob, я хотел бы задать несколько вопросов, чтобы выяснить все эти вещи в сравнении с багажом, который я привез с собой из PHP.

На моей линии:

  1. Это правильное место, чтобы принести модуль? Есть ли приемлемый способ проверки загрузки модуля и его обработки?

2. Это самый эффективный способ загрузки только тот метод, который я хочу?

3. В целом, разве так вы бы решили эту конкретную проблему?

Полагаю, я тоже охотюсь за рулем против вашего опыта в "реальном мире". Строковый модуль настолько распространен, что вы, скорее всего, его все равно загрузите?

Если это так, как вы проверяете, загружен ли модуль?

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

(ps взято из Обучение с Python ftw)

EDIT

ОК, для тех, кто интересуется, как было указано, мой вопрос введен в заблуждение, потому что я не смог понять, что в Python строка obj уже содержит метод replace ().

Это было вызвано тем, что я не смог сделать что-то вроде:

>>> dir("a string")

, который раскрыл бы все методы, включая «заменить»:

Итак, я мог бы продолжить это, набрав:

>>> "a string".replace.__doc__

Который изверг бы:

'S.replace (старый, новый [, количество]) -> строка Возвращает копию строки S с все вхождения подстроки старой заменены на новые. Если опционально указывается количество аргументов, только первый подсчет случаев заменяется. '

Теперь, конечно, я знал, что этот метод replace () ДОЛЖЕН существовать где-то, но я еще не знал, как искать и открывать для себя - документы Python, откровенно говоря, слишком "слабо связаны" для меня. Спасибо за ответы - но я публикую это РЕДАКТИРОВАНИЕ на тот случай, если любой другой, столь же невежественный и ошеломленный, но желающий защитник Python должен наткнуться.

Ответы [ 2 ]

2 голосов
/ 29 июня 2011

По соглашению, импорт размещается в верхней части вашего модуля / скрипта. Это облегчает их поиск для вас и других читающих ваш код. есть иногда веские причины для размещения импорта в другом месте, например, условный импорт со значительными накладными расходами.

Другое соглашение заключается не в том, чтобы «проверять», загружен ли модуль, а в том, чтобы полагаться на интерпретатор Python, чтобы вызвать исключение NameError, если разыменовываемый объект недоступен. Также обратите внимание, что множественный импорт одного и того же модуля безопасен, поскольку механизм импорта проверяет, был ли он уже импортирован.

Возможно, вы захотите прочитать http://docs.python.org/tutorial/modules.html и http://diveintopython.net/object_oriented_framework/importing_modules.html

В этом конкретном случае вам не нужно ничего импортировать, поскольку .replace() является методом строкового объекта. Модуль string в значительной степени избыточен (не полностью, но, по моему опыту, он редко импортируется).

s.replace(sub, '')
0 голосов
/ 29 июня 2011

Ответ на вопрос 1: Нет, добавьте модули вверху файла, если только вам не нужен условный импорт.

А остальные ответы довольно бесполезны, изучите этот код (с документами ):

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