typeError:并非所有参数都在字符串格式化期间进行了转换
Posted
技术标签:
【中文标题】typeError:并非所有参数都在字符串格式化期间进行了转换【英文标题】:typeError: not all arguments convereted during string formatting 【发布时间】:2018-06-14 14:28:25 【问题描述】:我有一个函数如下(我在python2.7上工作):
def ip_split(ip):
rtr, mask = cidr.split('/')
ip = ipaddress.ip_address(unicode(rtr))
if ip.version == 4:
n = ipaddress.IPv4Network(unicode(cidr), strict=False)
else:
n = ipaddress.IPv6Network(unicode(cidr), strict=False)
first, last = n[2], n[-2]
return n, first, last, n[1], n.network_address, mask
n_sub = "%s/%s" % ip_split('10.10.128.1/18')[3:]
Traceback (most recent call last):
File "python", line 18, in <module>
TypeError: not all arguments converted during string formatting
我收到 typeError: not all arguments 在字符串格式化期间转换。
这里有什么问题??
【问题讨论】:
好吧ip_split
返回一个 6 元组。这意味着ip_split(..)[3:]
返回一个三元组,而格式字符串中只有两个%s
s。
[3:]
返回n[1], n.network_address, mask
,但您在"%s/%s" % ip_split('10.10.128.1/18')
中只提供了两个字符串格式化目标
【参考方案1】:
您的 ip_split
函数返回一个 6 元组。如果您使用[3:]
切片运算符,您将从索引3
以及更远的地方获取所有内容,因此这将是一个三元组。
但是你的格式化字符串'%s/%s'
只有两个%s
s,所以Python会混淆。您可以(可能)通过从索引 4 进行切片来修复它,所以 [4:]
。
第二个问题是%
优先于索引,因此它将表达式视为('%s/%s' % ip_split('10.10.128.1/18'))[3:]
,而我认为您想首先获取元组的最后两项。您在此处使用空格这一事实并没有什么不同(是的,对于作用域,Python 会考虑空格,但不会考虑运算符优先级)。
或者,您可以使用[-2:]
,它更接近“最后两项”。所以:
n_sub = "%s/%s" % <b>(</b>ip_split('10.10.128.1/18')<b>[-2:]</b><b>)</b>
【讨论】:
以上是关于typeError:并非所有参数都在字符串格式化期间进行了转换的主要内容,如果未能解决你的问题,请参考以下文章
Python 错误:TypeError:字符串格式化期间并非所有参数都转换
TypeError:在字符串格式化python期间并非所有参数都转换了
TypeError:在字符串格式化python Flask期间并非所有参数都转换了[重复]