2015-08-29 3 views
0

я узнал, что с помощьюСтранная функция/класс в Python. Почему у нас это есть?

(int)('123') 

Works, то же самое, используя int('123')

Я исследовал его немного и заметил, что она работает с другими функциями тоже.

def add_10(num): 
    return num + 10 

print (add_10)(10) # prints 20 

И это также работает с классами

class MyClass(object): 
    def __init__(self, x): 
     self.x = x 

print (MyClass)(10).x # returns 10 

Я никогда, кажется, такое поведение прежде, она используется кем-либо? У этого есть имя? Где в документах это указано? Почему у нас это есть?

Он работает как в Python 2.7 и Python 3.

Edit:

Дальнейшие испытания, и я заметил, что скобка не имеют никакого эффекта. Использование ((((int))))('2') такое же, как int('2')

ответ

3

Давайте попробуем поместить это в другие слова: функция в Python - это обычный объект.

Добавление пары круглых скобок к имени объекта, независимо от того, что это такое, вызывает вызов предыдущего объекта - т. Е. Его метод __call__ вызывается с переданными параметрами.

Таким образом, имя в Python, независимо от функции или нет, может быть окружено круглыми скобками. Скобки будут разрешаться сначала, как выражение - так - в (int)(5), (int) обрабатывается как выражение, которое дает int. Который оказывается вызываемым объектом.

Один из способов облегчить понимание заключается в том, чтобы сделать выражение в круглых скобках менее простым. Например - можно придумать «добавленные функции», которые при добавлении создают новый вызываемый объект, который связывает возвращаемое значение со всеми функциями. Это более или менее просто, чтобы сделать это:

def compose(func1, func2): 
    def composed(*args, **kw): 
     return func2(func1(*args, **kw)) 
    return composed 

class addable(object): 
    def __init__(self, func): 
     self.func = func 
    def __add__(self, other): 
     if callable(other): 
      return addable(compose(self.func, other)) 
     raise TypeError 
    def __call__(self, *args, **kw): 
     return self.func(*args, **kw) 


@addable 
def mysum(a, b): 
    return a + b 

@addable 
def dup(a): 
    return a * 2 

И как это работает в интерактивной консоли:

>>> (mysum + dup)(3, 3) 
12 
>>> 
+0

Это довольно крутой способ выполнения композиции функций, но это довольно круто. –

2

Вы можете добавить parenthesis in many places, не затрагивая, как работает код:

>>> (1)+(2) 
3 
>>> (1)+(((2))) 
3 
>>> (((int)))('123') 
123 

Это не кастинг, вы только окружающие функциональный объект с скобкой.

+0

Хорошее время, я тоже это заметил. Таким образом, это дает утверждение. Сортировать как генератор. –

+0

Есть ли способ повлиять на код? Или просто ... есть? Я не вижу смысла в этом. –

+0

Дело в том, что нет ничего особенного в имени, связанном с функцией.Это выражение, как и все остальное, и выражения могут быть заключены в скобки. – chepner

1

Вы можете поставить скобки вокруг любого выражения. Один вид выражения - это имя. Имена могут ссылаться на любое значение, а строки, функции и типы - это всего лишь разные значения. Несколько слоев круглых скобок не являются особыми: поскольку выражение в скобках также является выражением, вы можете поместить их в круглые скобки.

Смежные вопросы