我正在编写一个大量使用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
但请记住,这很有趣,但在实际项目中使用这些技术可能会破坏许多其他功能。