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
.
所以请告诉我如何"重命名"内置替换功能.
首先,你几乎不应该使用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)
那是replace
在str
对象上访问方法,并将其存储在x
.像这样的"未绑定方法"可以通过传递str
(即任何普通字符串)的实例作为第一个参数来调用.所以:
x(my_string, ' ', '_')
Run Code Online (Sandbox Code Playgroud)
如果你想x
在str
类本身上添加名称作为方法,你想要的是"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)
...而且在某个时刻,即使你节省了几次击键,你也无法节省足够的可读性和惯用性.
归档时间: |
|
查看次数: |
3513 次 |
最近记录: |