Python: callable object

13-Sty-2018

Każdy obiekt ma swój typ i pewne właściwości. Jedną z tych właściwości jest informacja, czy obiekt można wywołać (dziwnie to brzmi po polsku „jest wywoływalny” więc będę używał „is callable”). Oczywiście funkcje są przykładem obiektów wywoływalnych. Zobacz:

Ale funkcja coś zwraca. W naszym przypadku zwraca liczbę. Czy liczba jest callable?

Jak uruchomisz ten przykład to zobaczysz, że nie. Funkcja się wywołała, zwróciła liczbę a liczba już nie jest callable. Nadal logiczne.

Ale – co by było, gdyby funkcja zwróciła obiekt funkcji? To bardzo dziwne, ale popatrz na taki prosty przykład:

Mamy funkcję, która jako argument przyjmuje napis OperationType

  • jeśli OperationType to napis „ADD” to zostanie zwrócona funkcja PLUS, która z kolei przyjmuje dwa argumenty a i b. Funkcja PLUS dodaje te liczby
  • jeżeli OperationType to cokolwiek innego, to zostanie zwrócona funkcja MINUS, która z kolei przyjmuje dwa argumenty a i b. Funkcja MINUS odejmuje te liczby

Czy to co zwraca funkcja DoOperation jest callable?

Jeśli uruchomisz powyższą linijkę to zobaczysz, że tak. To skoro wynik zwracany przez funkcję można wywołać to co się stanie przy takim zapisie:

  • DoOperation(‚ADD’)(3,1) – najpierw wywołaliśmy DoOperation, która zwróciła funkcję PLUS, a potem funkcja PLUS uruchomiła się z argumentami 3 i 1 i wynik to 4
  • DoOperation(‚SUBSTRACT’)(3,1) – najpierw wywołaliśmy DoOperation, która zwróciła funkcję MINUS, a potem funkcja MINUS uruchomiła się z argumentami 3 i 1 i wynik to 2

Oczywiście można by to zrobić też tak:

ale ten zapis rozciąga się na 2 linijki, a notacja o którą pytasz jest bardziej kompaktowa.

O funkcji callable:

https://www.programiz.com/python-programming/methods/built-in/callable

Inny przykład bazujący na definicji klasy i wywołania metody klasy:

https://stackoverflow.com/questions/111234/what-is-a-callable-in-python

Różnie programiści korzystają z tej notacji. Znajdziesz ją między innymi w Keras:

https://keras.io/getting-started/functional-api-guide/

zwróć uwagę na komentarz:

Dodaj komentarz:

Autor: Rafał Kraik