programing

원숭이 패치란 무엇입니까?

sourcetip 2022. 12. 26. 22:41
반응형

원숭이 패치란 무엇입니까?

원숭이 패치 또는 원숭이 패치가 무엇인지 이해하려고 합니다.

메서드/오퍼레이터의 과부하 또는 위임과 같은 것입니까?

이것들과 공통되는 점이 있나요?

아뇨, 그런 거랑은 달라요단순히 런타임에 속성을 동적으로 대체하는 것입니다.

들어 메서드가 를 생각해 .get_data이 메서드는 외부 검색(데이터베이스나 웹 API 등) 및 클래스 내의 다양한 메서드를 호출합니다.소스에 「 」, 「 」를 동적으로 합니다.get_data「스탭」입니다.

Python 클래스는 가변이며 메서드는 클래스의 속성일 뿐이므로 원하는 만큼 변경할 수 있습니다.또한 모듈 내의 클래스나 함수를 같은 방법으로 대체할 수도 있습니다.

, 코멘트가 지적한 바와 같이 원숭이를 잡을 때는 주의해야 합니다.

  1. 에 다른 이 호출된 get_data입니다. 나쁘기도 . -좋기도 하고 나쁘기도 합니다.이것이 좋든 나쁘든 상관없습니다.조심해요.

  2. Attribute도 변수 get_data까지 그 의 에일리어스를 .get_data (요? .) (?? Python? Python은 이름을 다시 붙입니다.get_data다른 이름 바인딩에는 영향이 없습니다.)

MonkeyPatch는 실행 시(일반적으로 시작 시)에 다른 코드를 확장하거나 수정하는 Python 코드의 일부입니다.

간단한 예는 다음과 같습니다.

from SomeOtherProduct.SomeModule import SomeClass

def speak(self):
    return "ook ook eee eee eee!"

SomeClass.speak = speak

출처: Zope Wiki의 MonkeyPatch 페이지.

원숭이 패치가 뭐죠?

간단히 말해, monkey patching은 프로그램 실행 중에 모듈 또는 클래스를 변경하는 것입니다.

사용 예

Panda 문서에는 원숭이 포획의 예가 있습니다.

import pandas as pd
def just_foo_cols(self):
    """Get a list of column names containing the string 'foo'

    """
    return [x for x in self.columns if 'foo' in x]

pd.DataFrame.just_foo_cols = just_foo_cols # monkey-patch the DataFrame class
df = pd.DataFrame([list(range(4))], columns=["A","foo","foozball","bar"])
df.just_foo_cols()
del pd.DataFrame.just_foo_cols # you can also remove the new method

이를 분석하려면 먼저 모듈을 Import합니다.

import pandas as pd

다음으로 메서드 정의를 만듭니다.이것은 클래스 정의의 범위 밖에 존재하며 자유롭습니다(함수와 언바인드 메서드의 구분이 매우 무의미하기 때문에 Python 3은 언바인드 메서드를 폐지합니다).

def just_foo_cols(self):
    """Get a list of column names containing the string 'foo'

    """
    return [x for x in self.columns if 'foo' in x]

다음으로 이 메서드를 사용하는 클래스에 첨부합니다.

pd.DataFrame.just_foo_cols = just_foo_cols # monkey-patch the DataFrame class

그런 다음 클래스의 인스턴스에서 메서드를 사용하고 완료되면 메서드를 삭제할 수 있습니다.

df = pd.DataFrame([list(range(4))], columns=["A","foo","foozball","bar"])
df.just_foo_cols()
del pd.DataFrame.just_foo_cols # you can also remove the new method

이름 조작에 관한 주의사항

name-mangling(이중 밑줄로 속성을 수정하여 이름을 변경하는 경우 권장하지 않음)을 사용하는 경우 수동으로 name-mangling을 수행해야 합니다.저는 이름 짓기를 추천하지 않기 때문에 여기서는 시연하지 않겠습니다.

테스트 예시

예를 들어 이 지식을 테스트에 어떻게 사용할 수 있을까요?

예를 들어, 에러가 발생하는 외부 데이터 소스에 대한 데이터 취득 콜을 시뮬레이트해야 합니다.이 경우 올바른 동작을 보증하고 싶기 때문입니다.이 동작을 보증하기 위해 데이터 구조에 패치를 적용할 수 있습니다.(따라서 Daniel Roseman이 제안한 것과 같은 메서드 이름을 사용합니다).

import datasource

def get_data(self):
    '''monkey patch datasource.Structure with this to simulate error'''
    raise datasource.DataRetrievalError

datasource.Structure.get_data = get_data

이 방법에 의존한 동작에 대해 테스트했을 때, 올바르게 실장되어 있는 경우, 테스트 결과에 그 동작이 표시됩니다.

'아주 좋다', '아주 좋다', '아주 좋다'가 됩니다.Structure프로세스 수명 동안 오브젝트를 생성하기 때문에 이를 피하기 위해 다음과 같이 Unittest에서 설정 및 티어다운을 사용할 수 있습니다.

def setUp(self):
    # retain a pointer to the actual real method:
    self.real_get_data = datasource.Structure.get_data
    # monkey patch it:
    datasource.Structure.get_data = get_data

def tearDown(self):
    # give the real method back to the Structure object:
    datasource.Structure.get_data = self.real_get_data

, (</FONT CHANGE:></FONT CHANGE:></FONT CHANGE:></FONT CHANGE:></FONT CHANGE:></FONT CHANGE:></FONT CHANGE:></FONT CHANGE:>)를 이 좋을지도 모릅니다.mock라이브러리를 사용하여 코드를 패치합니다. mock의 »patch데코레이터는 위의 작업보다 에러 발생률이 낮기 때문에 더 많은 코드 행이 필요하기 때문에 에러 발생의 기회가 많아집니다. 의 in in in in in의 하지 않았습니다.mock비슷한 방법으로 원숭이 패킹을 사용하는 것 같아요.)

위키피디아에 따르면:

Python에서 monkey patch라는 용어는 실행 시 클래스 또는 모듈의 동적 수정만을 가리키며, 원하는 대로 동작하지 않는 버그 또는 기능에 대한 회피책으로 기존의 서드파티 코드를 패치하려는 의도에 의해 동기 부여됩니다.

첫째, 원숭이 패치는 (내 생각에) 사악한 해킹이다.

모듈 또는 클래스 수준의 메서드를 커스텀 구현으로 대체하기 위해 자주 사용됩니다.

가장 일반적인 사용 사례는 원래 코드를 교체할 수 없는 경우 모듈 또는 클래스에 버그에 대한 해결 방법을 추가하는 것입니다.이 경우 monkey 패치를 통해 "잘못된" 코드를 자신의 모듈/패키지 내에 구현하여 바꿉니다.

Monkey 패치는 동적 언어로만 실행할 수 있으며, 그 중 python이 좋은 예입니다.오브젝트 정의를 갱신하는 대신 실행 시 메서드를 변경하는 것도 하나의 예입니다. 마찬가지로 실행 시 속성(메서드 또는 변수)을 추가하는 것은 monkey patching으로 간주됩니다.이는 소스가 없는 모듈로 작업할 때 자주 수행되므로 객체 정의를 쉽게 변경할 수 없습니다.

이는 객체의 정의가 실제로 어떻게 동작하는지를 완전히 또는 정확하게 설명하지 못한다는 것을 의미하기 때문에 좋지 않은 것으로 간주됩니다.

Monkey 패치는 실행 시 클래스 내의 기존 클래스 또는 메서드를 다시 열고 동작을 변경하는 것입니다.이 동작은 신중하게 사용해야 합니다.또는 꼭 필요한 경우에만 사용해야 합니다.

Python은 동적 프로그래밍 언어이기 때문에 클래스를 다시 열고 수정하거나 교체할 수 있습니다.

원숭이 패치란 무엇입니까?Monkey 패치는 런타임에 코드 조각의 동작을 동적으로 업데이트하기 위해 사용되는 기술입니다.

왜 원숭이 패치를 사용하는가?실제로 소스 코드를 수정하지 않고 런타임에 라이브러리, 모듈, 클래스 또는 메서드의 동작을 수정 또는 확장할 수 있습니다.

결론: Monkey 패치 적용은 멋진 기술이며, Python에서 패치 적용 방법을 배웠습니다.그러나 이미 논의한 바와 같이, 그것은 그 자체의 결점이 있으므로 신중하게 사용해야 합니다.

언급URL : https://stackoverflow.com/questions/5626193/what-is-monkey-patching

반응형