@DrPalmer

Как здесь правильно сделать split?

Есть вот такой кусок кода, но при обработке, выдает ошибку. Суть в том, что мне нужно разделить название машины из vm['name'] и передать в return
Только изучаю python, и как не игрался с типом данных, не помогает. Хельп:(
Апи возвращает параметр в vm['name'] типа aff-java-8.node.eu.consul

Traceback (most recent call last):
  File "/Users/palmer/Documents/python/forforum.py", line 17, in <module>
    b = get_next_hostname('aff-java-8.node.eu.consul')
  File "/Users/palmer/Documents/python/forforum.py", line 13, in get_next_hostname
    y = '%s-%s-%d.node.eu.consul' % (parts[0], parts[1], str(parts[2]) + 6)
TypeError: can only concatenate str (not "int") to str


import requests
import json
import re

response = requests.get('http://127.0.0.1/asl_real.json')
asl_vms = json.loads(response.text)
vms = {}

def get_next_hostname():
    for vm in asl_vms:
        hostname = vm['name']
        parts = hostname.split('-')
        y = '%s-%s-%d.node.eu.consul' % (parts[0], parts[1], str(parts[2]) + 6)
    return y


b = get_next_hostname('aff-java-8.node.eu.consul')
print(b)
  • Вопрос задан
  • 167 просмотров
Решения вопроса 1
drygdryg
@drygdryg
Python-разработчик
Вы пытаетесь сложить строку (str) с целым числом (int):
y = '%s-%s-%d.node.eu.consul' % (parts[0], parts[1], str(parts[2]) + 6)

parts — это список, состоящий из строк, поэтому parts[2] будет в любом случае строкой — писать str(parts[2]) здесь избыточно. Если вы хотите увеличить это число, нужно сначала преобразовать его в int. Но в parts[2] будет находиться строка вида "8.node.eu.consul", от которой сначала нужно отделить число.
Итоговое решение может выглядеть так:
y = '%s-%s-%d.node.eu.consul' % (parts[0], parts[1], int(parts[2].split('.')[0]) + 6)

или так (число вынесено в отдельную переменную):
number = int(parts[2].split('.')[0])
y = '%s-%s-%d.node.eu.consul' % (parts[0], parts[1], number + 6)


Совет: используйте метод str.format вместо форматирования в стиле Си:
number = int(parts[2].split('.')[0])
y = '{}-{}-{}.node.eu.consul'.format(parts[0], parts[1], number + 6)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
SoreMix
@SoreMix Куратор тега Python
yellow
can only concatenate str (not "int") to str


Соединить строку можно только со строкой (не с числом)
Вы соединяете строку с числом:
str(parts[2]) + 6

Если и надо добавить 6 к концу строки - то делаете число строкой:
str(parts[2]) + '6'

Если подразумевалось что число из parts[2] надо увеличить на 6 - делаем его числом и прибавляем к числу
int(parts[2])+6
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы