2015-04-15 3 views
1

Я написал сценарий, который довольно темпераментен с отступом, поэтому я решил сделать функции. Я довольно новичок в python, и теперь, когда я создал эти функции, ничего не работает!Почему моя функция python не выполняется?

def main(): 
    wiki_scrape() 
    all_csv() 
    wiki_set = scraped_set('locations.csv') 
    country_set = all_set('all.csv') 
    print wiki_set 

Мне просто интересно, правильно ли это вызывать функции из функции main()? Я обсуждал, возникает ли проблема с отступом внутри вызываемых функций, python, похоже, очень полагается на правильные углубления, даже если он не вызывает ошибки!

Полный код - http://pastebin.com/gJGdHLgr

+0

Если все ваши функции выглядят как 'main()', тогда у вас нет проблем. – quamrana

+5

Вы называете 'main'? Python - это не Java, где главный объект вызывается при запуске. – Scironic

+0

Убедитесь, что вы вызываете 'main'. Вы называете это следующим образом: 'main()'. –

ответ

6

Похоже, что вам нужно сделать это:

def main(): 
    wiki_scrape() 
    all_csv() 
    wiki_set = scraped_set('locations.csv') 
    country_set = all_set('all.csv') 
    print wiki_set 

main() # this calls your main function 

Еще лучше:

def main(): 
    wiki_scrape() 
    all_csv() 
    wiki_set = scraped_set('locations.csv') 
    country_set = all_set('all.csv') 
    print wiki_set 

if __name__ == '__main__': 
    main() # this calls your main function 

Затем запустите его из командной строки, как это:

python file_name.py 

Встроенная переменная __name__ - это текущее контекстное пространство имен. Если вы запустите скрипт из командной строки, он будет эквивалентен '__main__'. Если вы запустите/импортируете файл .py в качестве модуля из другого места, в том числе изнутри интерпретатора, пространство имен (внутри контекста модуля) будет именем файла .py или именем пакета, если оно является частью пакет. Например:

## my_file.py ## 
print('__name__ is {0}'.format(__name__)) 
if __name__ = '__main__': 
    print("Hello World!") 

Если вы сделаете это из командной строки:

python my_file.py 

Вы получите:

__name__ is __main__ 
Hello World! 

Если импортировать его из переводчика, однако, вы можете увидеть, что __name__ не является __main__:

>>> from my_file import * 
>>> __name__ is my_file 
+0

Это довольно странно, почему python позволяет использовать код с функциями? Я заметил, что этот вопрос пытается попробовать, но я никогда не понимал этого. – Gaddi

+0

Это позволяет запускать файлы python в виде скриптов (например, 'python myscript.py' из командной строки). Он также позволяет устанавливать код установки, который запускается, когда файл импортируется как модуль. – TheBlackCat

+0

'main' не означает ничего в Python, как на других языках. Вы можете позвонить в свою основную программу, что угодно. Вам просто нужно позвонить. –

4

Python не вызывает никаких функций при запуске, если явно не задано (включая main).

Вместо этого Python называет исполняемые файлы, при этом основной файл запускается под номером __main__.

Если вы хотите просто вызвать основную функцию, вы можете использовать ответ Рика.

Однако в Python лучшей практике это лучше сделать следующее:

if __name__ == '__main__': 
    wiki_scrape() 
    all_csv() 
    wiki_set = scraped_set('locations.csv') 
    country_set = all_set('all.csv') 
    print wiki_set 

Это гарантирует, что если вы используете этот питон файл в качестве основного файла (файл, нажмите на, или запустить из ЦМДА), то эти функции будут выполняться.

Если это используется как импортированный модуль, вы все равно можете использовать функции в скрипте, импортирующие модуль, но они не будут вызываться автоматически и, следовательно, не будут мешать вызывающему скрипту.

+3

Используя это, вы помещаете 'wiki_set' и' country_set' в глобальное пространство имен, поэтому я предпочел бы использование дополнительной основной функции. – Matthias

+1

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

+0

@Doug, я, конечно, сделал это, используя main в качестве функции, которую нужно вызвать. Но обычно, только когда у меня есть модуль, посвященный функции, которая будет использоваться только в другом месте. Я редко видел, что кто-то использует главную функцию в скрипте, который является автономным, но это могут быть только люди, с которыми я работаю. – Scironic