typeError: не все аргументы преобразуются при форматировании строки

У меня есть функция следующим образом (я работаю над 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: не все аргументы преобразуются при форматировании строки.

Что может быть не так здесь??

1 ответ

Решение

Ваш ip_split Функция возвращает 6-кортеж. Если вы используете [3:] оператор среза, вы получите все из индекса 3 и далее, так что это будет 3-кортеж.

Но ваша строка форматирования '%s/%s' есть только два %ss, так что Python запутался. Вы можете (вероятно) исправить это с помощью нарезки из индекса четыре, так что [4:],

Вторая проблема заключается в том, что % имеет приоритет над индексированием, поэтому оно видит выражение как ('%s/%s' % ip_split('10.10.128.1/18'))[3:]в то время как я думаю, что вы хотите сначала получить последние два элемента кортежа. Тот факт, что вы используете пробелы здесь, не имеет значения (да, для определения объема Python учитывает пробелы, но не для приоритета оператора).

Кроме того, вы можете использовать [-2:], что ближе к "последним двум пунктам". Так:

n_sub = "%s/%s" % (ip_split('10.10.128.1/18')[-2:])
Другие вопросы по тегам