2014-12-19 1 views
-3

()없이 함수를 호출 할 수 있습니까? 어쨌든 __call__()과 같은 마법 방법을 악용하는 것일까 요?없이 함수 호출

내가

from IPython import embed as qq

비슷한 뭔가를 할 수 있지만,이 호기심에서 더 많은, 그리고에 대한 학습 운동으로 qq()

보다는 단지 qq를 통해 embed()를 호출하고 싶습니다

파이썬, 실용적인 목적보다는.

+0

수 없습니다. '__call__'은 호출 가능한 것을 만들기 위해 사용되지만 실제로는 실제로 호출 구문을 사용해야합니다. –

+0

글쎄, 기술적으로 당신은 repl에서'__repr__'을 악용하여 그것을 할 수 있지만, 대화식 인터프리터 밖에서는 작동하지 않을 것입니다. 또는'__getattr__'을 악용하여 클래스의 속성에 대해서만 작동합니다. – l4mpi

답변

0

배우고 싶다면 파이썬으로 놀아 라.

In [1]: def foo(): 
    ...:  pass 
    ...: 

In [2]: foo 
Out[2]: <function __main__.foo> 

In [3]: foo() 

In [4]: bar = foo 

In [5]: bar 
Out[5]: <function __main__.foo> 

In [6]: bar() 

보시다시피

, foo하지 않습니다 전화 기능, 그것은 것 반환 그것. 그리고 인수로 전달하여 할당 할 수 있기 때문에 좋은 것입니다 (예 : bar = foo).

1

__call__은 함수가 ()으로 호출 된 경우에만 호출됩니다. 함수가 클래스에있는 경우, 다음과 같이 뭔가를, @property 장식을 사용할 수 있습니다이

import math 

class Circle(object): 
    def __init__(self, radius): 
     self.radius = radius 

    @property 
    def area(self): 
     return math.pi * (self.radius ** 2) 

print(Circle(5).area) 
# 78.53981633974483 

getter 및 setter here

4

당신이 REPL (파이썬 쉘)를 사용하는 경우에 대해 자세히 알아보기, REPL 당신을 위해 개체에 대한 repr()를 호출하기 때문에 당신은 (다시 자신의 __repr__ 메소드를 호출하는)이 주위에 당신의 방법을 해킹 할 수

from IPython import embed 

class WrappedFunctionCall(object): 
    def __init__(self, fn): 
     self.fn = fn 
    def __repr__(self): 
     self.fn() 
     return "" # `__repr__` must return a string 

qq = WrappedFunctionCall(embed) 

# Typing "qq" will invoke embed now and load iPython. 

을하지만 실제로는, 당신은해야 N ot 이럴 수 있습니다!

물론이 경우에는 __repr__을 호출 할 항목이 없으므로 REPL 외부에서 작동하지 않습니다. 분명히 전달 인수는 "지원"되지 않습니다. 그렇지

>>> class Wtf(object): 
...  @property 
...  def yadda(self): 
...   print "Yadda" 
... 
>>> w = Wtf() 
>>> w.yadda 
Yadda 
>>> 

당신이 당신의 자신의 주문을 "마법"명령을 정의하는 방법에 IPython의 문서를 확인 할 수 있습니다 : 순수 파이썬에서

0

당신 ( 그 함수에)) (사용하지 않고 함수 foo를 호출 할 수

def call_function(fun_name,*args): 
    return fun_name(*args) 

def foo(a,b): 
    return a+b 

print call_function(foo,1,2) 

# Prints 3 

이 대답은 완전히 심각하지는 않지만 흥미로운 파이썬 코드 조각을 포함하고 있습니다.