Python typeError:在字符串格式化过程中并非所有参数都转换

Python typeError:在字符串格式化过程中并非所有参数都转换,python,string,python-2.7,typeerror,output-formatting,Python,String,Python 2.7,Typeerror,Output Formatting,我的函数如下(我正在使用python2.7): def ip_分割(ip): rtr,mask=cidr.split(“/”) ip=ipaddress.ip_地址(unicode(rtr)) 如果ip.version==4: n=ipaddress.ipv4网络(unicode(cidr),strict=False) 其他: n=ipaddress.ipv6网络(unicode(cidr),strict=False) 第一,最后=n[2],n[-2] 返回n,first,last,n[1],n

我的函数如下(我正在使用python2.7):

def ip_分割(ip):
rtr,mask=cidr.split(“/”)
ip=ipaddress.ip_地址(unicode(rtr))
如果ip.version==4:
n=ipaddress.ipv4网络(unicode(cidr),strict=False)
其他:
n=ipaddress.ipv6网络(unicode(cidr),strict=False)
第一,最后=n[2],n[-2]
返回n,first,last,n[1],n.网络地址,掩码
n_sub=“%s/%s”%ip_分割('10.10.128.1/18')[3:]
回溯(最近一次呼叫最后一次):
文件“python”,第18行,在
TypeError:在字符串格式化过程中并非所有参数都已转换
我得到了typeError:不是所有的参数都在字符串格式化过程中转换


这里有什么问题吗?

您的
ip\u split
函数返回一个6元组。如果您使用
[3://code>切片运算符,您将从索引
3
中获取所有内容,然后进一步,这将是一个3元组

但是您的格式化字符串
'%s/%s'
只有两个
%s
s,因此Python会感到困惑。您可以(可能)通过从索引4进行切片来修复它,因此
[4://code>

第二个问题是
%
优先于索引,因此它将表达式视为
(“%s/%s”%ip\u split('10.10.128.1/18'))[3:///code>,而我认为您应该首先获取元组的最后两项。在这里使用空格并没有什么区别(是的,对于作用域,Python考虑了空格,但不考虑运算符优先级)

或者,您可以使用更接近“最后两项”的
[-2:]
。因此:


n_sub=“%s/%s”%(ip_分割('10.10.128.1/18')[-2:])
Well
ip_分割
返回一个6元组。这意味着
ip\u split(…)[3://code>返回一个3元组,而格式字符串中只有两个
%s
s。
[3://code>返回
n[1]、n.network\u address、mask
,但您在
%s/%s”%ip\u split('10.10.128.1/18')中只提供了两个字符串格式化目标。
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
n_sub = "%s/%s" % (ip_split('10.10.128.1/18')[-2:])