2010-06-08 2 views
3

Просто интересно, почемуимпортирующих классов питон

import sys 
exit(0) 

дает мне эту ошибку:

Traceback (most recent call last): 
    File "<pyshell#1>", line 1, in ? 
    exit(0) 
TypeError: 'str' object is not callable 

но

from sys import exit 
exit(0) 

работает нормально?

+0

Как вы получаете первую ошибку. Для меня в скрипте он просто выходит без распечатки – Mark

+1

Возможно, работает сценарий, а не интерактивный режим. exit() - специальная команда интерактивного режима. – FogleBird

+0

Возможно, он выйдет, прежде чем вы сможете увидеть распечатку. Вы пытаетесь запустить его в IDLE? – Richard

ответ

8

Python импортирует только выбранные имена в пространство имен.

Ваш эквивалент первое решение должно быть

sys.exit(0) 

С import sys импортирует только sys ключевое слово в текущем пространстве имен.

6

См. http://effbot.org/zone/import-confusion.htm для всех способов использования import в Python.

импорт SYS

Это импортирует модуль Sys и связывает его с именем «SYS» в пространстве имен. «Выход», и другие члены модуля Sys не приведены в пространстве имен напрямую, но могут быть доступны как так:

sys.exit(0) 

из SYS импортного выхода

Это импортирует специфические элементы модуля Sys в ваше пространство имен. В частности, это связывает имя «exit» с функцией sys.exit.

exit(0) 

Чтобы увидеть, что находится в пространстве имен, используйте функцию dir.

>>> import sys 
>>> dir() 
['__builtins__', '__doc__', '__name__', '__package__', 'sys'] 
>>> 
>>> from sys import exit 
>>> dir() 
['__builtins__', '__doc__', '__name__', '__package__', 'exit', 'sys'] 

Вы даже можете увидеть, что все находится в самом модуле SYS:

>>> dir(sys) 
['__displayhook__', '__doc__', '__egginsert', '__excepthook__', '__name__', '__package__', '__plen', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_getframe', 'api_version', 'argv', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle', 'dont_write_bytecode', 'exc_clear', 'exc_info', 'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'getcheckinterval', 'getdefaultencoding', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', 'getwindowsversion', 'hexversion', 'maxint', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'py3kwarning', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions', 'winver'] 
0

Ok из ваших ответов я могу вспомнить, что:

import sys from * 

будет импортировать все члены из SYS

+2

Это, конечно, обескураживает, потому что это создает загрязнение пространства имен. Сценарий 'print len ​​(locals()); из sys import *; print len ​​(locals()) 'производит 4, а затем 47 в качестве значения локальной переменной. Это нежелательно по нескольким причинам, главным образом, увеличивается вероятность того, что ваше имя затеняет импортированное имя. Хотя для одноразовых скриптов и тестирования это не * ужасно *, но, как правило, этого следует избегать. –

+0

Да, я согласен с тем, что вы говорите Уэйн. Это может привести к неожиданным результатам. Вот почему я назвал Лакшмана Прасада ответом как номер один. Возможно, я не должен был включать этот ответ, если он смущает других.Спасибо за разъяснение – Richard

+1

1) Синтаксис «from sys import *» (у вас есть ключевые слова назад) и 2) Никогда не используйте эту функцию. –

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