본문 바로가기
파이썬

파이썬 괄호없이 함수를 호출하는 목적 python

by º기록 2020. 12. 22.
반응형

다음을 고려하세요:

class objectTest():

    def __init__(self,a):

        self.value = a

    def get_value(self):

        return self.value


class execute():

    def __init__(self):

        a = objectTest(1)
        b = objectTest(1)

        print(a == b)
        print(a.get_value() == b.get_value)
        print(a.get_value() == b.get_value())
        print(a.get_value == b.get_value)


if __name__ == '__main__':

    execute = execute();

이 코드는

>>>
False
False
True 
False

get_value가 함수라는 점을 감안할 때 실행이 중지되고 오류가 반환 될 것으로 예상하지만 그렇지 않습니다. 누군가 파이썬 인터프리터가 속성 오류를 발생시키는 대신 이런 종류의 구문을 허용하는 이유를 설명 할 수 있습니다. 제 경우에는 소중한 시간을 절약 할 수있었습니다.

 

해결 방법

 

언급했듯이 함수와 메서드는 일류 객체입니다. 끝에 괄호 (대괄호)를 넣어 호출 합니다. 그러나 파이썬이 왜 그렇게 할 수 있는지에 대한 더 많은 동기를 원하시는 것 같습니다. 함수가 일류인지 아닌지 왜 신경 써야할까요?

때로는 호출하고 싶지 않고 호출 가능 자체에 대한 참조를 전달하고 싶습니다.

from multiprocessing import Process
t = Process(target=my_long_running_function)

위의 뒤에 대괄호를 넣으면 메인 스레드에서 my_long_running_function 을 실행합니다. 거의 당신이 원했던 것! 새로운 프로세스에서 실행될 콜 러블에 대한 참조를 Process 에 제공하려고했습니다.

때로는 콜 러블을 지정하고 다른 것을 허용하고 싶을 때가 있습니다.

def do_something(s):
    return s[::-1].upper()

map(do_something,['hey','what up','yo'])
Out[3]: ['YEH', 'PU TAHW', 'OY']

(이 경우 map ) 인수를 입력합니다.

아마도 당신은 콜 러블들을 컬렉션에 드롭하고 당신이 원하는 것을 동적으로 가져오고 싶을 것입니다.

from operator import *

str_ops = {'<':lt,'>':gt,'==':eq} # etc
op = str_ops.get(my_operator)
if op:
    result = op(lhs,rhs)

위는 연산자의 문자열 표현을 실제 작업에 매핑하는 한 가지 방법입니다.

 

참조 페이지 https://stackoverflow.com/questions/21785933

 

 

반응형

댓글