2017-10-10 10 views
1

파이썬 3 print() 알고있는 바와 같이, 함수 그것은 전직에 대한 json.dumps(indent=4)장식 파이썬의 내장 인쇄() 함수

에서 포장의 장식 된 버전을 만들 수 있습니다.

print(mydict)를 호출하면 당신이 할 수있는 장식 자체가 필요하지 않습니다 print(json.dumps(mydict, indent=4))

+1

왜 이것이 데코레이터가되어야합니까? –

답변

7

과 동일한 결과를 생성한다. 그냥 새로운 함수를 정의하고 그것을 print 전화 : 원래 인쇄 기능에 액세스 할 같이

import builtins 

def print(*args, **kwargs): 
    builtins.print(json.dumps(*args, **kwargs, indent=4)) 

당신은 builtins 모듈을 사용할 수 있습니다.

실제로이 작업을 수행하면 사람들을 혼란스럽게하는 점을 제외하면 print 외에도 새로운 기능을 호출하는 것 이상의 효과를 얻지 못합니다.

당신이 정말로 (old_print로 원본을 액세스하는) 당신이 old_print = builtins.print를 저장 my_print로 새로운 함수를 정의 할 수있는 사람을 혼동하고 builtins.print = my_print로합니다. 그렇다면 수정 된 print은 실제로 귀하의 헛소리에 대해 알지 못하는 다른 모듈에서도 실제로는 print으로 바뀝니다. 그러나 그것은 더 나쁜 생각입니다.

+1

'builtins' 모듈을 사용하여 주셔서 감사합니다. 실제로 매우 편리하고 영리한 솔루션입니다. – nehemiah

-2

아니요, print은 내장 함수이며 내장 C 수준 클래스가 아니기 때문에 불가능합니다. This answerstr과 같은 내장 객체를 서브 클래스 화하고 그 중 하나의 메소드에 데코레이터를 적용하는 방법을 제공합니다.

+1

@ BrenBarn의 대답은 어떻게 * 가능한지 보여줍니다. –

+0

@AdamSmith Barn의 답변은 데코레이터를 사용하지 않습니다. 그것이 원래 질문 한 것입니다. –

+1

장식 업체 정보 : https://gist.github.com/anonymous/c6ee1be4befc1c38d34cd02553b31945 –

0

gist에 대한 @Adam Smith에게 감사의 말을 전합니다.

import builtins 
import functools 
import json 

orig_print = builtins.print 

def indent4(f): 
    @functools.wraps(f) 
    def wrapped(*args, **kwargs): 
     return f(json.dumps(*args, **kwargs, indent=4)) 
    return wrapped 

@indent4 
def print(*args, **kwargs): 
    return orig_print(*args, **kwargs)