Python strip 内置方法使用上的误区

本文涉及的产品
简介: 最近在调查配置问题过程中,发现一个比较低级的错误,应该是 python 使用习惯的问题,和大家分享一下,比较有意思。问题介绍在系统的配置脚本中有一句这样的逻辑:# etcd_nodes like this: 'http://172.16.1.1:2380'etcd_nodes.append(etcd_node_host.rstrip(':2380').lstrip('http://'))我们预期的结果当然是获取到 '172.16.1.1' 这个 IP 地址。

最近在调查配置问题过程中,发现一个比较低级的错误,应该是 python 使用习惯的问题,和大家分享一下,比较有意思。

问题介绍

在系统的配置脚本中有一句这样的逻辑:

# etcd_nodes like this: 'http://172.16.1.1:2380'
etcd_nodes.append(etcd_node_host.rstrip(':2380').lstrip('http://'))

我们预期的结果当然是获取到 '172.16.1.1' 这个 IP 地址。但是在实际使用的时候,遇到了这样的问题:

image.png

分析一下原因

我们先来看下 python 内置方法 strip 这类方法的定义了实现,官方定义:

    def rstrip(self, chars=None): # real signature unknown; restored from __doc__
        """
        S.rstrip([chars]) -> string or unicode
        
        Return a copy of the string S with trailing whitespace removed.
        If chars is given and not None, remove characters in chars instead.
        If chars is unicode, S will be converted to unicode before stripping
        """
        return ""

参数中的 chars 是字符的list,不是字符串匹配,这个字符的作用怎么理解呢?举个例子,

>>> a='test it 888888888'
>>> print a.rstrip('8')
test it
>>> a='test it8 888888888'
>>> print a.rstrip('8')
test it8

简单的说,就是匹配到最后一个不是给定 chars 的字符就停止。
那么如果传入的参数是一个字符串呢:

>>> a='test it887878888888'  
>>> print a.rstrip('78')
test it

所以,这样的匹配其实就是匹配到最后一个不是 chars 这个数组中任意的一个字符为止。

这样,就能解释为什么前面的 rstrip(':2380') 对 'http://172.1.1.2:2380' 的结果是 'http://172.1.1.' 的原因
了。

结论

对于像 strip, rstrip, lstrip 这样最基本、简单的功能,还是需要了解清楚其使用方法,不能因为一次试用成功就以为满足功能需求了。这样的误用,如果上线,危害还是比较大的。

相关文章
|
2天前
|
存储 Linux Shell
python移除/删除非空文件夹/目录的最有效方法是什么?
python移除/删除非空文件夹/目录的最有效方法是什么?
8 0
|
5天前
|
Python
【Python 基础】Python中的实例方法、静态方法和类方法有什么区别?
【5月更文挑战第6天】【Python 基础】Python中的实例方法、静态方法和类方法有什么区别?
|
5天前
|
数据处理 Python
Python中每个字段增加多条数据的高效方法
Python中每个字段增加多条数据的高效方法
10 1
|
5天前
|
存储 数据挖掘 Python
Python技术分享:实现选择文件或目录路径的方法
Python技术分享:实现选择文件或目录路径的方法
15 2
|
5天前
|
数据处理 Python
Python中按指定数量分割列表字符串的方法
Python中按指定数量分割列表字符串的方法
9 1
|
9天前
|
Python
使用Python pandas的sort_values()方法可按一个或多个列对DataFrame排序
使用Python pandas的sort_values()方法可按一个或多个列对DataFrame排序。示例代码展示了如何按'Name'和'Age'列排序 DataFrame。先按'Name'排序,再按'Age'排序。sort_values()的by参数接受列名列表,ascending参数控制排序顺序(默认升序),inplace参数决定是否直接修改原DataFrame。
23 1
|
11天前
|
机器学习/深度学习 数据可视化 前端开发
【Python机器学习专栏】机器学习模型评估的实用方法
【4月更文挑战第30天】本文介绍了机器学习模型评估的关键方法,包括评估指标(如准确率、精确率、召回率、F1分数、MSE、RMSE、MAE及ROC曲线)和交叉验证技术(如K折交叉验证、留一交叉验证、自助法)。混淆矩阵提供了一种可视化分类模型性能的方式,而Python的scikit-learn库则方便实现这些评估。选择适合的指标和验证方法能有效优化模型性能。
|
11天前
|
机器学习/深度学习 算法 Python
【Python机器学习专栏】Python中的特征选择方法
【4月更文挑战第30天】本文介绍了机器学习中特征选择的重要性,包括提高模型性能、减少计算成本和增强可解释性。特征选择方法主要包括过滤法(如相关系数、卡方检验和互信息)、包装法(如递归特征消除和顺序特征选择)和嵌入法(如L1正则化和决策树)。在Python中,可利用`sklearn`库的`feature_selection`模块实现这些方法。通过有效的特征选择,能构建更优的模型并深入理解数据。
|
11天前
|
机器学习/深度学习 数据采集 数据可视化
【Python 机器学习专栏】数据缺失值处理与插补方法
【4月更文挑战第30天】本文探讨了Python中处理数据缺失值的方法。缺失值影响数据分析和模型训练,可能导致模型偏差、准确性降低和干扰分析。检测缺失值可使用Pandas的`isnull()`和`notnull()`,或通过可视化。处理方法包括删除含缺失值的行/列及填充:固定值、均值/中位数、众数或最近邻。Scikit-learn提供了SimpleImputer和IterativeImputer类进行插补。选择方法要考虑数据特点、缺失值比例和模型需求。注意过度插补和验证评估。处理缺失值是提升数据质量和模型准确性关键步骤。
|
11天前
|
开发者 Python
【亮剑】Python中`List.append()`方法不起作用的原因及解决方案
【4月更文挑战第30天】本文探讨了Python中`List.append()`方法不起作用的原因及解决方案。问题可能源于变量作用域、可变类型与不可变类型混淆、函数内的局部变量、错误的赋值操作或并发修改。解决方法包括检查变量、确保正确操作列表、使用`global`关键字、避免错误赋值和采用同步机制处理并发问题。理解这些问题对于编写健壮的Python代码至关重要。

热门文章

最新文章