2012-05-03 3 views
5

이것은 내게 묻은 인터뷰 질문입니다. 이치에 맞지 않으면 나를 벌하지 마라. 그녀가 물었습니다 :파이썬에서 기존 타사 라이브러리의 함수를 변경하는 방법

"파이썬에 기존 제 3 자 lib가 있고 그 안에 foo() 함수가 있습니다. 기존 모듈에서 가져온 후에이 함수를 어떻게 수정합니까?"

+0

내 머리 꼭대기에서 래퍼 기능을 사용하십시오. –

답변

2

이것을 원숭이 패치라고합니다. 즉, 함수를 포함하는 변수에 할당 할 수 있습니다.

import existingmodule 

existingmodule.foo = lambda *args, **kwargs: "You fail it" 

실제로는 거의 올바른 대답이 아닙니다. 자신의 함수로 무언가를 래핑하거나 다른 곳에서 직접 구현을 제공하거나 상속을 사용하는 것이 훨씬 낫습니다 (클래스의 메서드 인 경우).

변경된 비헤이비어를 라이브러리 자체의 코드 (또는 다른 제 3 자 코드)에 반영해야하는 유일한 이유입니다. 그렇다면 잘 테스트하십시오. 일반적으로 포크를 만드는 것보다 더 나은 방법입니다. 즉, 코드를 패치로 제출하는 것이 좋을 수도 있으므로 프로젝트에서 허용하는 경우 지원하는 것만이 아닙니다.

1

가장 일반적인 방법은 Monkey patching이 될 것입니다 (참조 : stackoverflow: what is monkey patching)를 예를 들어

: 당신이 youtube

에서 볼 수 PyCon 2012 년 주제에 talk 아주 좋은 있었다
>>> import os 
>>> os.listdir('.') 
['file_a', 'file_b'] 
>>> os.listdir = lambda folder: ['nothing in here, nope!'] 
>>> os.listdir('.') 
['nothing in here, nope!'] 

대화는 원숭이 패치가 유용 할 수있는 좋은 예를 제공합니다. 특정 작업을 수행하는 타사 라이브러리가 있다고 가정 해보십시오. 실행을 위해이 스크립트는 루트 권한으로 실행해야하지만 실제 기능에는 루트 권한이 필요하지 않습니다. 이제 제 3 자 라이브러리가 os.geteuid() == 0으로 이것을 확인했을 것입니다. 이 라이브러리를 사용하는 코드에서 원숭이 패치를 적용하면 geteuid을 덮어 쓰면이 제한 사항을 해결할 수있는 루트가 될 수 있습니다.

원숭이 패치를 사용하면 라이브러리를 빠르게 수정할 수 있습니다. 버그 보고서를 작성하고 패치를 기다리는 데는 시간이 걸릴 수 있으므로 라이브러리 소스 코드를 파고 들지 않고 이런 식으로 스스로 도울 수 있습니다.

+1

아무 것도하지 않는 것이 "좋은 방법"이 아닙니다. 때로는 뭔가를하는 유일한 방법 일뿐입니다. – Marcin

관련 문제