2015-01-10 4 views
2

Я очень смутился. У меня есть набор функций python, все из которых я объединил в файл, называемый (скажем) useful.py. Затем я могу прочитать модуль в моей IPython сМодули Python: функции, вызывающие друг друга

import useful as uf 

, а затем я могу получить доступ к отдельным функциям с

uf.meaning_of_life() 

и так далее. Стандартный материал.

Однако некоторые функции в этом файле вызывают другие функции. Я могу вызывать одну функцию в любое время с uf., но как насчет функций, которые называют друг друга? Если функция, называемая eat, ссылается на другую функцию, называемую chew, как eat знает, где найти chew? Я могу назвать оба: uf.eat и uf.chew.

Я могу игнорировать все это, просто делая execfile('useful.py'), который работает отлично, но я хотел бы получить больше ручки в модульной системе.

В настоящее время, когда я использую import, моя попытка использовать мои функции вызывает ошибки; когда я использую execfile все работает отлично.

Я ценю, что это может быть истолковано как очень важный вопрос для новичков, но я прихожу на Python с фона Matlab, и мой естественный наклон заключается в использовании execfile. Указатели на информацию были бы очень желанными.

+1

'eat' и' chew' функции в одном модуле могут ссылаться друг на друга своими неквалифицированными именами 'eat' и' chew'. –

+0

Если вы действительно должны импортировать все в «useful.py» в пространство имен вашего текущего модуля python, «из полезного импорта» будет импортировать все, кроме имен с префиксом «_». Затем они могут быть доступны из текущего модуля как 'chew', а не' uf.chew'. Эта практика, как правило, неодобрилась, потому что вы вдруг не знаете, какие имена уже определены. – zehnpaard

+0

Кстати, какая ошибка? И что случилось с использованием 'uf.chew'? – zehnpaard

ответ

-1

Во-первых, его рекомендуется использовать с определением импорта somefile, поскольку я позволяю мне использовать определения своих функций, чтобы дать вам четкое изображение. Я напишу простые функции, чтобы поесть и жевать. где жуют ссылки.

useful.py

def eat(): 
    print 'Eaten' 

def chew(): 
    eat() 

основной код File.py

from useful import chew as uf 

uf() 

Позвонив UF псевдоним для функции жевания, который ссылается на функцию есть. Добро пожаловать на python.

+0

Если вы используете только одну (или несколько) функции с очень очевидными именами или или класс с тем же именем, что и модуль, использование «import полезно» в порядке, поскольку оно импортирует одно имя *, под которым каждая функция существует вместо того, чтобы загрязнять текущее пространство имен. Этот ответ также * не совсем * ответ на исходный вопрос (если только я не ошибаюсь). – Darkhogg

0

Прежде всего, чтобы понять, что происходит, каждый модуль является собственным пространством имен.

Если у вас есть модуль, как это:

def chew(): 
    print('chewing') 

def eat(): 
    print('eating') 
    chew() 

Разве не очевидно, что eat можно назвать chew без каких-либо проблем? Они определены на одном уровне, в глобальном (модульном) объеме, поэтому они могут видеть друг друга.

Теперь мы следующее другого модуля:

import useful as uf 

uf.eat() 

Для того, чтобы получить доступ к chew, нам нужно написать uf.chew, так же, как мы набранный uf.eat. Нам нужно это сделать, потому что мы находимся в другом модуле.Для того, чтобы мы могли сделать что-то из этого, нам пришлось import useful, чтобы наш модуль знал об этом. Наши знания модуля useful состоят в том, что его содержимое добавляется к uf.

То, что наш точка зрения. Но модуль usefulзнает все о себе. Там ничего не изменилось, ему не нужно импортировать себя для доступа к его содержимому, и он не знает ничего о других модулей, которые у него нет import ed.

Так, чтобы ответить, eat знает, как найти chew, потому что они находятся в том же модуле, и, следовательно, в том же объеме .

+0

Большое спасибо за ваше четкое объяснение. Поэтому дайте мне понять: eat() может с радостью получить доступ к chew(), потому что они находятся в одном модуле, но с моей точки зрения я могу получить доступ только к каждому из них как uf.eat() и uf.chew() , В этом есть смысл. Однако факт остается фактом: если я использую импорт, то некоторые из функций просто не работают, но если я прочитаю файл с execfile, все они работают отлично. Я не уверен, что я делаю неправильно ... – Alasdair

+0

Скорее всего, вы сделали что-то неправильно в своем модуле. Если вы опубликовали [SSCCE] (http://sscce.org/) в своем вопросе, я мог бы помочь вам в этом. – Darkhogg

+0

Я разместил файл на странице https://docs.google.com/document/d/12P_qDqbDikSFuNilCbiNwPxbJAH8-6NtXmfTaFUnAe0/edit?usp=sharing, в котором содержится краткое объяснение и код нарушения. Большое спасибо! – Alasdair

Смежные вопросы