Python TypeError: должно быть str, а не int для строки - PullRequest
0 голосов
/ 04 июля 2018

Я работаю над проектом Python (3.6), в котором мне нужно добавить целочисленное значение в многострочную строку.

Вот мой код:

    for var in list(range(1, no_of_svc + 1)):
        svar = str(var)
        print(type(svar))
        port = type(data['configuration']['svc' + svar]['port']['port'])
        print(port)
        port = str(data['configuration']['svc' + svar]['port']['port'])
        deployments = deployment + '''\n
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: ''' + data['deployment_name'] + '''-''' + data['configuration']['svc' + str(var)]['name'] + '''
  labels:
    #Project ID
    app: ''' + data['configuration']['svc' + str(var)]['name'] + '''
spec:
  #Run two instances of our application
  replicas: ''' + data['configuration']['svc' + str(var)]['replicas'] + '''
  template:
    metadata:
      labels:
        app: ''' + data['configuration']['svc' + str(var)]['name'] + '''
    spec:
      #Container details
      containers:
        - name: ''' + data['configuration']['svc' + str(var)]['versions']['v1']['name'] + '''
          image: ''' + data['configuration']['svc' + str(var)]['versions']['v1']['image'] + '''
          imagePullPolicy: Always
          #Ports to expose
          ports:
          - containerPort: ''' + port + '''        
'''

Как вы можете видеть в приведенном выше коде, я преобразовал port в строку, и даже выходные данные print(type(svar)) и print(port) равны <class 'str'>, но все же он не работает.

Вот сообщение об ошибке:

   - containerPort: ''' + port + '''
 TypeError: must be str, not int

Я перевернул его с помощью метода format, и он работает:

    no_of_svc = int(data['configuration']['no_of_svc'])
    deployment = ''
    deployments = ''''''
    for var in list(range(1, no_of_svc + 1)):
        deployments = deployment + '''\n
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: {}
  labels:
    #Project ID
    app: {}
spec:
  #Run two instances of our application
  replicas: {}
  template:
    metadata:
      labels:
        app: {}
    spec:
      #Container details
      containers:
        - name: {}
          image: {}
          imagePullPolicy: Always
          #Ports to expose
          ports:
          - containerPort: {}        
'''.format(data['deployment_name'] + '-' + data['configuration']['svc' + str(var)]['name'],
           data['configuration']['svc' + str(var)]['name'],
           data['configuration']['svc' + str(var)]['replicas'],
           data['configuration']['svc' + str(var)]['name'],
           data['configuration']['svc' + str(var)]['versions']['v1']['name'],
           data['configuration']['svc' + str(var)]['versions']['v1']['image'],
           data['configuration']['svc' + str(var)]['port']['port'])
    print(deployments)

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

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Сообщение об ошибке / трассировка указывает на то место, где была обнаружена ошибка, а не обязательно на то место, где оно действительно происходит. Мы не можем воспроизвести ошибку, так как вы не опубликовали правильный MCVE (мы не знаем, что у вас в data), но есть вероятность, что настоящая проблема на самом деле в одном из многочисленных других значений, объединенных от data upper в коде (помните, что для python все deployment = deployment + '''(...)''' является одним оператором.

Но в любом случае: вы делаете это неправильно с самого начала . Вместо конкатенации вы хотите использовать операции форматирования строки , которые гораздо более читабельны И позаботятся о необходимых преобразованиях.

0 голосов
/ 04 июля 2018

Используйте format, чтобы поместить значение port в вашу строку.

Смотрите это: -

>>> port = 'my string1'
>>> str1 = ''' this is the second string and here is {} '''.format(port)
>>> str1
' this is the second string and here is my string1 '
...