В первом тестовом случае оператор присваивания не используется. Он просто использует форму инициализации, называемую «инициализация копирования». При инициализации объекта инициализация кода не рассматривает явные конструкторы.
struct A {
A();
// explicit copy constructor
explicit A(A const&);
// explicit constructor
explicit A(int);
// non-explicit "converting" constructor
A(char const*c);
};
A a;
A b = a; // fail
A b1(a); // succeeds, "direct initialization"
A c = 1; // fail, no converting constructor found
A d(1); // succeeds
A e = "hello"; // succeeds, converting constructor used
Инициализация копирования используется в тех случаях, которые соответствуют неявным преобразованиям, где явно не запускается преобразование, как при передаче аргумента функции и возврате из функции.
Каждый раз, когда интерпретатор Python читает исходный файл, он делает две вещи:
это устанавливает несколько специальных переменных как [1 111], и затем
это выполняет весь код, найденный в файле.
Позволяют нам видеть, как это работает и как это касается Вашего вопроса о __name__
проверки, которые мы всегда видим в сценариях Python.
Позволяет нам использовать немного отличающийся пример кода, чтобы исследовать, как работают импорт и сценарии. Предположим, что следующее находится в файле, названном foo.py
.
# Suppose this is foo.py.
print("before import")
import math
print("before functionA")
def functionA():
print("Function A")
print("before functionB")
def functionB():
print("Function B {}".format(math.sqrt(100)))
print("before __name__ guard")
if __name__ == '__main__':
functionA()
functionB()
print("after __name__ guard")
, Когда Python interpeter читает исходный файл, он сначала определяет несколько специальных переменных. В этом случае мы заботимся о __name__
переменная.
, Когда Ваш Модуль Является Основной Программой
при выполнении модуля (исходный файл) как основная программа, например,
python foo.py
интерпретатор присвоит трудно кодированную строку "__main__"
__name__
переменная, т.е.
# It's as if the interpreter inserts this at the top
# of your module when run as the main program.
__name__ = "__main__"
, Когда Модуль будет Импортирован Другим
, С другой стороны, предположите, что некоторый другой модуль является основной программой, и это импортирует модуль. Это означает, что существует оператор как это в основной программе, или в некотором другом модуле основной импорт программы:
# Suppose this is in some other main program.
import foo
В этом случае, интерпретатор посмотрит на имя файла Вашего модуля, foo.py
, снимет изоляцию эти .py
и присвоит ту строку Вашему модулю __name__
переменная, т.е.
# It's as if the interpreter inserts this at the top
# of your module when it's imported from another module.
__name__ = "foo"
После того, как специальные переменные будут настроены, интерпретатор выполняет весь код в модуле, один оператор за один раз. Можно хотеть открыть другое окно на стороне с примером кода, таким образом, можно следовать наряду с этим объяснением.
Всегда
Это печатает строку "before import"
(без кавычек).
Это загружает math
модуль и присваивает его переменной, названной math
. Это эквивалентно замене import math
со следующим (обратите внимание, что __import__
функция низкого уровня в Python, который берет строку и инициировал фактический импорт):
# Find and load a module given its string name, "math",
# then assign it to a local variable called math.
math = __import__("math")
Это печатает строку "before functionA"
.
Это выполняется def
блок, создавая функциональный объект, затем присваивая тот функциональный объект переменной, названной functionA
.
Это печатает строку "before functionB"
.
Это выполняет второе def
блок, создавая другой функциональный объект, затем присваивая его переменной, названной functionB
.
Это печатает строку "before __name__ guard"
.
Только, Когда Ваш Модуль Является Основной Программой
__name__
был действительно установлен на [1 133] и это вызывает эти две функции, печатая строки "Function A"
и "Function B 10.0"
. Только, Когда Ваш Модуль Импортируется Другим
__name__
будет "foo"
, не "__main__"
, и это пропустит тело if
оператор. Всегда
"after __name__ guard"
в обеих ситуациях. Сводка
, Таким образом, вот то, что было бы распечатано в этих двух случаях:
# What gets printed if foo is the main program
before import
before functionA
before functionB
before __name__ guard
Function A
Function B 10.0
after __name__ guard
# What gets printed if foo is imported as a regular module
before import
before functionA
before functionB
before __name__ guard
after __name__ guard
Вы могли бы естественно задаться вопросом, почему кто-либо захочет это. Ну, иногда Вы хотите записать .py
файл, который может и использоваться другими программами и/или модулями как модуль, и может также быть выполнен как сама основная программа. Примеры:
Ваш модуль является библиотекой, но Вы хотите иметь режим сценария, куда он выполняет некоторые модульные тесты или демонстрацию.
Ваш модуль используется только в качестве основной программы, но он имеет некоторые модульные тесты и работы среды тестирования путем импорта .py
файлы как сценарий и выполнения специальных тестовых функций. Вы не хотите, чтобы он попытался выполнить сценарий просто, потому что это импортирует модуль.
Ваш модуль главным образом используется в качестве основной программы, но он также предоставляет благоприятный для программиста API опытным пользователям.
Вне тех примеров, это изящно, что выполнение сценария в Python просто настраивает несколько волшебных переменных и импортирует сценарий. "Выполнение" сценария является побочным эффектом импорта модуля сценария.
Вопрос: у меня могут быть [приблизительно 1 143] блоки проверки? Ответ: странно сделать так, но язык не остановит Вас.
предположим следующее находится в [1 144]. Что происходит, если Вы говорите python foo2.py
относительно командной строки? Почему?
# Suppose this is foo2.py.
def functionA():
print("a1")
from foo2 import functionB
print("a2")
functionB()
print("a3")
def functionB():
print("b")
print("t1")
if __name__ == "__main__":
print("m1")
functionA()
print("m2")
print("t2")
__name__
регистрация foo3.py
: # Suppose this is foo3.py.
def functionA():
print("a1")
from foo3 import functionB
print("a2")
functionB()
print("a3")
def functionB():
print("b")
print("t1")
print("m1")
functionA()
print("m2")
print("t2")
# Suppose this is in foo4.py
__name__ = "__main__"
def bar():
print("bar")
print("before __name__ guard")
if __name__ == "__main__":
bar()
print("after __name__ guard")
Когда Ваш сценарий выполняется путем передачи его как команды к интерпретатору Python,
python myscript.py
весь код, который является на уровне отступа 0, выполнен. Функции и классы, которые определяются, ну, в общем, определяются, но ни один из их кода не выполняется. В отличие от других языков, нет никакого main()
функция, которая выполняется автоматически - эти main()
, функция является неявно всем кодом на верхнем уровне.
В этом случае, код верхнего уровня if
блок. __name__
встроенная переменная, которая оценивает к названию текущего модуля. Однако, если модуль выполняется непосредственно (как в [1 112] выше), то __name__
вместо этого установлен на строку "__main__"
. Таким образом можно протестировать, выполняется ли сценарий непосредственно или импортированной чем-то еще путем тестирования
if __name__ == "__main__":
...
, Если сценарий импортируется в другой модуль, его различные функциональные и определения классов будут импортированы, и его код верхнего уровня будет выполнен, но код в тогдашнем теле if
пункт выше не будет выполнен, поскольку условие не соблюдают. Как основной пример, рассмотрите следующие два сценария:
# file one.py
def func():
print("func() in one.py")
print("top-level in one.py")
if __name__ == "__main__":
print("one.py is being run directly")
else:
print("one.py is being imported into another module")
# file two.py
import one
print("top-level in two.py")
one.func()
if __name__ == "__main__":
print("two.py is being run directly")
else:
print("two.py is being imported into another module")
Теперь при вызове интерпретатора как [1 125]
python one.py
вывод будет
top-level in one.py
one.py is being run directly
, Если Вы будете работать two.py
вместо этого:
python two.py
Вы добираетесь
top-level in one.py
one.py is being imported into another module
top-level in two.py
func() in one.py
two.py is being run directly
Таким образом, когда модуль one
загружается, __name__
равняется "one"
вместо [1 120].
Самое простое объяснение __name__
переменная (по моему скромному мнению), следующее:
Создают следующие файлы.
# a.py
import b
и
# b.py
print "Hello World from %s!" % __name__
if __name__ == '__main__':
print "Hello World again from %s!" % __name__
Выполнение их получит Вас этот вывод:
$ python a.py
Hello World from b!
, Как Вы видите, когда модуль импортируется, наборы Python globals()['__name__']
в этом модуле к имени модуля. Кроме того, на импорт выполняется весь код в модуле. Как if
оператор оценивает к False
, эта часть не выполняется.
$ python b.py
Hello World from __main__!
Hello World again from __main__!
, Как Вы видите, когда файл выполняется, наборы Python globals()['__name__']
в этом файле к "__main__"
. На этот раз if
оператор оценивает к [1 111] и выполняется.
if __name__ == "__main__"
часть, которая работает, когда сценарий выполняется от (говорит) командная строка с помощью команды как python myscript.py
.
{7,40}
и иметь гораздо меньше ложных положительных сторон. @Greg Hewgill: мои/usr/share/dict слова также содержат " acceded" " defaced" " effaced" и " facaded" - и первые три распространены, по крайней мере, относительно deedeed!
– Cascabel
30 July 2010 в 15:08
Если интерпретатор Python будет runningВ конкретный модуль тогда __name__
, то глобальная переменная будет иметь значение "__main__"
def a():
print("a")
def b():
print("b")
if __name__ == "__main__":
print ("you can see me" )
a()
else:
print ("You can't see me")
b()
при выполнении этого сценария печать , Вы видите меня
при импорте этого файла, говорят файлу B и выполняются, файл B тогда if __name__ == "__main__"
в файле A становится ложью, таким образом, это печатает , Вы не видите меня
b