Что делать, если __name__ == & ldquo; __ main __ & rdquo ;: do?

В первом тестовом случае оператор присваивания не используется. Он просто использует форму инициализации, называемую «инициализация копирования». При инициализации объекта инициализация кода не рассматривает явные конструкторы.

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

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

5186
задан RAM 25 May 2018 в 09:30
поделиться

5 ответов

Каждый раз, когда интерпретатор 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"

Выполнение Кода Модуля

После того, как специальные переменные будут настроены, интерпретатор выполняет весь код в модуле, один оператор за один раз. Можно хотеть открыть другое окно на стороне с примером кода, таким образом, можно следовать наряду с этим объяснением.

Всегда

  1. Это печатает строку "before import" (без кавычек).

  2. Это загружает 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")
  1. Это печатает строку "before functionA".

  2. Это выполняется def блок, создавая функциональный объект, затем присваивая тот функциональный объект переменной, названной functionA.

  3. Это печатает строку "before functionB".

  4. Это выполняет второе def блок, создавая другой функциональный объект, затем присваивая его переменной, названной functionB.

  5. Это печатает строку "before __name__ guard".

Только, Когда Ваш Модуль Является Основной Программой

  1. , Если Ваш модуль будет основной программой, то это будет видеть, что __name__ был действительно установлен на [1 133] и это вызывает эти две функции, печатая строки "Function A" и "Function B 10.0".

Только, Когда Ваш Модуль Импортируется Другим

  1. ( вместо этого ), Если Ваш модуль не будет основной программой, но будет импортирован другим, то __name__ будет "foo", не "__main__", и это пропустит тело if оператор.

Всегда

  1. Это будет печатать строку "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")
5579
ответ дан Mr Fooz 25 May 2018 в 09:30
поделиться

Когда Ваш сценарий выполняется путем передачи его как команды к интерпретатору 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].

1655
ответ дан Tonechas 25 May 2018 в 09:30
поделиться
  • 1
    Вы корректны, I' ve, в мире ASP.NET слишком длинный:-) – Chris Ballance 26 May 2009 в 17:28

Самое простое объяснение __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] и выполняется.

658
ответ дан pi. 25 May 2018 в 09:30
поделиться

if __name__ == "__main__" часть, которая работает, когда сценарий выполняется от (говорит) командная строка с помощью команды как python myscript.py.

113
ответ дан Mark Amery 25 May 2018 в 09:30
поделиться
  • 1
    @sheepsimulator: По-видимому, потому что it' s распространенный для сокращения хешей - хотя продолжительность сокращения по умолчанию в выводе мерзавца равняется 7, таким образом, Вы могли довольно безопасно перейти в {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

3
ответ дан 22 November 2019 в 19:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: