Python: в чем разница между вызовом метода С () и без?


Это должно быть что-то очень простое и очевидное, потому что я просто не могу найти ответ через google или здесь...

Какое значение имеют скобки в Python, когда я вызываю методы?

Пример кода с pygame и скобками:

import pygame
import sys

pygame.init()

screen = pygame.display.set_mode((640, 480))

running = True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    pygame.display.update()

Когда я щелкаю крестик окна, оно закрывается с помощью sys.exit () - последнее, что вызывается в Traceback.

Когда я изменяю его на это:

import pygame
import sys

pygame.init()

screen = pygame.display.set_mode((640, 480))

running = True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit

    pygame.display.update()

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

Я столкнулся с этим, когда следовал этому учебнику для Panda3D здесь: http://www.mygamefast.com/volume1/

В некоторых вопросах (например, здесь в методе keyboardSetup класса ArcadeFlightGame): http://www.mygamefast.com/volume1/issue5/4/) он называет " sys.выход" вместо " sys.exit () " и игра завершается правильно. Если я изменю его на " sys.exit () " вызывает некоторую ошибку при запуске.

Это кажется настолько простым, что никто толком не объяснил его в любом месте... Я был бы очень признателен, если бы кто-нибудь мог немного просветить меня на этот счет : /

1 2

1 ответ:

Если вы не используете скобки, вы не вызываете функцию. Все очень просто. sys.exit абсолютно ничего не делает, sys.exit() вызывает функцию.

При этом иногда имя функции без скобок передается какой-либо другой функции или привязывается к событию. В таком случае скобки не используются, потому что вы говорите этой другой функции или событию "вызовите это в соответствующее время".

Например, в учебнике, на который вы ссылаетесь, есть эта строка код:

self.accept("escape", sys.exit)

Это Не вызов sys.выход. Вместо этого он сообщает системе событий: "когда вы обнаружите клавишу escape, вызовите эту функцию". В момент вызова этого кода sys.exit является Не вызываемым, а скорее зарегистрированным для последующего вызова. Когда клавиша escape нажата, базовая структура фактически вызовет функцию, используя скобки.

Таким образом, существует разница между немедленным вызовом функции (с помощью ()) и регистрация функции (используя только имя, нет ()).