重命名内置的python方法,如replace()

CJ *_*ine 2 python replace module

我正在编写一个使用该string.replace()方法的python脚本.我知道如果我从模块导入python方法,我可以使用from如下更改名称:

from time import sleep as x
Run Code Online (Sandbox Code Playgroud)

然后,x(5)将是相同的time.sleep(5).但是我该怎么做到replace()函数呢?它不是来自任何外部模块,我试图这样做:

x = replace()
Run Code Online (Sandbox Code Playgroud)

但它不起作用.它说NameError: name 'replace' is not defined.

所以请告诉我如何"重命名"内置替换功能.

aba*_*ert 5

首先,你几乎不应该使用string.replace.正如文档所说:

以下函数列表也定义为字符串和Unicode对象的方法; 有关这些的更多信息,请参见字符串方法一节 您应该将这些函数视为已弃用...

其次,由于两个不同的原因,这是错误的:

x = replace()
Run Code Online (Sandbox Code Playgroud)

首先,没有内置命名replace,并且您的模块中没有名称的全局命名replace.如果你没有from string import *或者from string import replace,那么你就不会得到这个错误,但是如果你这样做,你可能只是做from string import replace as x,正是因为你已经做了time.sleep.

其次,这些括号表示您正在调用函数,并将其返回值赋值给x,而不是将函数本身作为值.


所以,我想你想要的是这个:

x = str.replace
Run Code Online (Sandbox Code Playgroud)

那是replacestr对象上访问方法,并将其存储在x.像这样的"未绑定方法"可以通过传递str(即任何普通字符串)的实例作为第一个参数来调用.所以:

x(my_string, ' ', '_')
Run Code Online (Sandbox Code Playgroud)

如果你想xstr类本身上添加名称作为方法,你想要的是"monkeypatching",通常,它很简单:

str.x = str.replace
Run Code Online (Sandbox Code Playgroud)

不幸的是,它不适用于大多数内置类型,至少在CPython中是这样; 你会得到这样的错误:

TypeError: can't set attributes of built-in/extension type 'str'
Run Code Online (Sandbox Code Playgroud)

您当然可以创建自己的子类str,并在整个地方使用它而不是str...但是这对字符串文字,从其他函数返回的字符串等没有帮助,除非您明确地将它们包装起来.而且我不确定这是值得的.但如果你想:

class s(str):
    x = str.replace
Run Code Online (Sandbox Code Playgroud)

现在你可以这样做:

z = s(function_returning_a_string())
z = z.x(' ', '_')
Run Code Online (Sandbox Code Playgroud)

但请注意,最后,z回归是一个str而不是一个s,所以如果你想继续使用x,你必须这样做:

z = s(z.x(' ', '_'))
Run Code Online (Sandbox Code Playgroud)

...而且在某个时刻,即使你节省了几次击键,你也无法节省足够的可读性和惯用性.