【问题标题】:Python TypeError: must be str, not int for a StringPython TypeError:必须是 str,而不是字符串的 int
【发布时间】:2018-07-04 06:47:16
【问题描述】:

我正在开发一个 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)

有什么问题?

【问题讨论】:

  • 哪一行出现错误?
  • 更新了,请再看一遍!
  • 为什么不放在 str(port) 中?
  • 这是使用format() 的充分理由之一。 deployments = """blah {foo} blah {bar}""".format(foo=config['foo'], bar=bar)
  • 你怎么知道是port?它可能是deployment,它是同一语句的一部分或该字符串中的任何其他值。出现错误消息是因为port 在字符串的末尾,请检查所有其他消息。

标签: python string python-3.x typeerror string-concatenation


【解决方案1】:

使用formatport 的值放入您的字符串中。

看这个:-

>>> 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 '

【讨论】:

    【解决方案2】:

    错误消息/回溯将您指向检测到错误的地方,而不是真正发生错误的地方。我们无法重现该错误,因为您没有发布正确的 MCVE(我们不知道您的 data 中有什么),但真正的问题可能实际上是从 data 上级连接的众多其他值之一在代码中(请记住,对于 python,整个 deployment = deployment + '''(...)''' 是一条语句。

    但无论如何:你从一开始就做错了。您想要use string formatting operations 而不是串联,它更具可读性并且会处理必要的转换。

    【讨论】:

    • 这不应该是评论吗?
    猜你喜欢
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    相关资源
    最近更新 更多