2014-09-16 3 views
2

나는 string.replace() 메소드를 많이 사용하는 파이썬 스크립트를 작성 중이다.replace()와 같은 내장 파이썬 메소드 이름 바꾸기

from time import sleep as x 

을 그리고, x(5)time.sleep(5)과 같은 것이다 : 나는 모듈에서 파이썬 방법을 가져 오는 경우 내가 지금처럼 from를 사용하여 이름을 변경할 수 있다는 것을 알고있다. 하지만 replace() 함수를 어떻게 할 수 있습니까? 어떤 외부 모듈도 아니므로이 작업을 시도했습니다.

x = replace() 

그러나 작동하지 않습니다. 그것은 NameError: name 'replace' is not defined라고합니다.

그래서 기본 교체 기능의 이름을 바꾸는 방법을 알려주십시오.

+1

이유 : 당신은 또한 당신이 아마 원하는 것은

some_magic() 'asdf'.my_replace('a', 'f') # calls 'asdf'.replace('a', 'f') 

이고 그건 당신이 정말 엉망으로 생각하지 않는 것 덤비는없이 불가능, 그러나

my_replace = str.replace my_replace('asdf', 'a', 'f') # calls 'asdf'.replace('a', 'f') 

을 수행 할 수 있습니다 'str' 객체에 대해'replace' 메소드 대신'string.replace'를 사용 하시겠습니까? 파이썬 1.5를 쓰지 않는다면 ... – abarnert

+0

문맥에서 바꾸기의 사용을 바꾸고 싶다는 것을 의미합니까?'s = "hello world"; s = s.replace ('hello', 'goodbye') ' –

+0

str 클래스는 기본 제공되는 확장이므로 네임 스페이스를 편집 할 수 없습니다. 그러나 파생 클래스에서 원하는대로 하위 클래스를 만들고 기능을 정의 할 수 있습니다. – mdurant

답변

5

먼저, string.replace을 거의 사용하지 않아야합니다. 문서가 말하는 것처럼 :

다음 목록은 문자열 및 유니 코드 개체의 메서드로도 정의됩니다. 자세한 내용은 문자열 방법을 참조하십시오.

x = replace() 

첫째, replace를라는 이름의 내장이없고, 하나 replace라는 이름의 모듈에는 글로벌 없다 : 사용되지 않는 것처럼 당신은 ...

둘째 이러한 기능을 고려해야합니다,이 두 개의 별도 이유로 잘못 . from string import * 또는 from string import replace을 수행 한 경우이 오류가 발생하지 않지만 이미 수행중인 경우 time.sleep과 똑같은 from string import replace as x을 정확하게 수행 할 수 있습니다.

두 번째로,이 괄호는 함수를 호출하고 함수 자체를 값으로 사용하지 않고 반환 값을 x에 할당한다는 의미입니다.


그래서, 나는 당신이 원하는 것은이 생각 : str 개체에 replace 방법에 접근하고 x에 저장하는 것

x = str.replace 

. 이와 같은 "언 바운드 메서드"는 str (즉, 일반 문자열)의 인스턴스를 첫 번째 인수로 전달하여 호출 할 수 있습니다.그래서 :

x(my_string, ' ', '_') 
는 "monkeypatching"라고 원하고, 일반적으로 매우 간단 무엇

당신이 str 클래스 자체의 방법으로 이름 x을 추가하려면 :

str.x = str.replace 

불행히도 적어도 CPython에서는 대부분의 내장 유형에서 작동하지 않습니다. 이 같은 오류가 발생합니다 :

TypeError: can't set attributes of built-in/extension type 'str' 

당신은 물론 str의 자신의 서브 클래스를 생성하고, 모든 대신 str의 여기 저기 그 사용 ...하지만 그 문자열 리터럴에 도움이되지 않습니다 수, 문자열을 명시 적으로 랩핑하지 않는 한 다른 함수 등에서 돌아온다. 그리고 그게 그럴만한 가치가 있는지 확신 할 수 없습니다.

class s(str): 
    x = str.replace 

지금 당신이 할 수 있습니다 : 당신이 원하는 경우에, z

z = s(function_returning_a_string()) 
z = z.x(' ', '_') 

을하지만 결국에 그 통지 당신이 원한다면, s보다는 str 인에 돌아 x를 계속, 당신은이 작업을 수행해야한다 :

z = s(z.x(' ', '_')) 

... 그리고 특정 지점에서, 당신은 몇 번의 키 입력을 저장하는 경우에도, 당신은 아니에요 읽기 쉽고 관용적으로 비용을 절감 할 수 있습니다.

+0

"str.x = str.replace' 아쉽게도 대부분의 기본 제공 유형에서 작동하지 않습니다 ..." 이 문구는이 문제에 대한 최고의 도움이되었습니다. 원숭이 패치가 내장되어 있지 않은 것이 확실합니다. 그러나 실제로이 작업을 수행하려고 할 때 대개 기본 제공 유형 인 것으로 보입니다. – jdj081

0

당신은 종류의 당신이 원하는 것을 할 수 있습니다

a = 'asdf' 

a_replace = a.replace 

지금 a_replacea_replace(whatever)를 호출 할 때 a.replace(whatever) 않는 바인딩 된 메서드 개체입니다.

# Awful hack. Last resort only. 
import gc 
for referrer in gc.get_referrers(str.replace): 
    if type(referrer) is dict and str.__dict__ in gc.get_referrers(referrer): 
     # Almost certainly the dict behind str's dictproxy. 
     referrer['my_replace'] = str.replace 
     break 
관련 문제