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



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

from time import sleep as x

然后,x(5)将与time.sleep(5)相同.但是我该如何对 replace(( 函数执行此操作?它不是来自任何外部模块,我尝试这样做:

x = replace()

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

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

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

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

其次,这是错误的,原因有两个:

x = replace()

首先,没有名为 replace 的内置模块,您的模块中也没有名为 replace 的全局。如果你做了from string import *from string import replace,那么你就不会得到这个错误——但如果你这样做,你可以只做from string import replace as x,就像你已经为time.sleep所做的那样。

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


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

x = str.replace

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

x(my_string, ' ', '_')

如果你想在str类本身上添加 name x 作为方法,你想要的叫做"monkeypatching",通常很简单:

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 = s(function_returning_a_string())
z = z.x(' ', '_')

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

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

。在某个时候,即使你节省了几次击键,你也没有足够的成本来支付可读性和惯用性。

你可以做你想做的事:

a = 'asdf'
a_replace = a.replace

现在a_replace是一个绑定方法对象,当您调用 a_replace(whatever) 时,它会a.replace(whatever)。你也可以做

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

但是,您可能想要的是

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

如果不弄乱你真的不应该惹的东西,这是不可能的:

# 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

绝对不建议在您的任何项目中进行。但这是可能的:我们可以做一些元黑客 - 用我们的自定义 str 替换内置的 str

class myStr(str):
    def def my_replace(self, __old, __new, __count):
        return self.replace(__old, __new, __count)
__builtins__.__dict__['str'] = myStr

现在 str 的所有用法都被我们的实现所取代。您可以添加或更改所需的任何内容。在我们的例子中,两种替换方法都可以工作,一种继承自str,另一种由我们创建:

print('dsadas'.replace('d', '_'))
>>> _sa_as
print('dsadas'.my_replace('d', '_'))
>>> _sa_as

但请记住,这很有趣,但在实际项目中使用这些技术可能会破坏许多其他功能。

最新更新