Python. Еще одна скобка рядом с функцией - PullRequest
1 голос
/ 14 марта 2019

У меня есть код, как показано ниже.

x = inputs
if conv_first:
    x = conv(x)
    if batch_normalization:
        x = BatchNormalization()(x)
    if activation is not None:
        x = Activation(activation)(x)

Здесь я не понимаю, как работает x = BatchNormalization () (x) (так же, как и x = Activation (активация) (x) тоже). Если бы это была BatchNormalization (x), это было бы легко.

Кто-нибудь может кратко объяснить, что это такое и как это работает?

Заранее большое спасибо.

Ответы [ 2 ]

4 голосов
/ 14 марта 2019

Оба класса кажутся реализующими __call__(). Затем BatchNormalization() создает экземпляр, а (x) вызывает .__call__(x) для экземпляра.

3 голосов
/ 14 марта 2019

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

Рассмотрим этот код:

def f(arg):
    print(arg)

def g():
    return f

x = "hi"

g()(x)  # equivalent to f(x), since f is what g returns

Обратите внимание, что g() возвращает функцию f без ее фактического выполнения, поэтому в операторе g return нет скобок.

...