【问题标题】:TypeError: not all arguments converted during string formatting pythonTypeError:在字符串格式化python期间并非所有参数都转换了
【发布时间】:2022-01-10 00:04:01
【问题描述】:

该程序应该接受两个名称,如果它们的长度相同,它应该检查它们是否是同一个单词。如果是同一个词,它将打印 "The names are the same"。如果它们的长度相同但字母不同,它将打印“名称不同但长度相同”。我遇到问题的部分是底部 4 行。

#!/usr/bin/env python
# Enter your code for "What's In (The Length Of) A Name?" here.
name1 = input("Enter name 1: ")
name2 = input("Enter name 2: ")
len(name1)
len(name2)
if len(name1) == len(name2):
    if name1 == name2:
        print ("The names are the same")
    else:
        print ("The names are different, but are the same length")
    if len(name1) > len(name2):
        print ("'{0}' is longer than '{1}'"% name1, name2)
    elif len(name1) < len(name2):
        print ("'{0}'is longer than '{1}'"% name2, name1)

当我运行这段代码时,它会显示:

Traceback (most recent call last):
  File "program.py", line 13, in <module>
    print ("'{0}' is longer than '{1}'"% name1, name2)
TypeError: not all arguments converted during string formatting

非常感谢任何建议。

【问题讨论】:

    标签: python string python-3.x typeerror output-formatting


    【解决方案1】:

    您正在混合使用不同的格式函数。

    旧式% 格式化使用% 代码进行格式化:

    'It will cost $%d dollars.' % 95
    

    新型{} 格式使用{} 代码和.format 方法

    'It will cost ${0} dollars.'.format(95)
    

    请注意,对于旧式格式,您必须使用元组指定多个参数:

    '%d days and %d nights' % (40, 40)
    

    在您的情况下,由于您使用的是{} 格式说明符,请使用.format

    "'{0}' is longer than '{1}'".format(name1, name2)
    

    【讨论】:

    • 在 python 3.6 中:f"'It will cost ${your_variable} dollars."
    • @JinSnow 它不需要 $ 符号。
    • 他添加它是为了结果的可读性,尽管语法不正确(也包括开头的单引号)。结果将是'It will cost $50 dollars.
    • 对@JinSnow 评论的补充.. 如果您还想打印变量名,f"'It will cost {your_variable=} dollars."
    【解决方案2】:

    错误在于您的字符串格式。

    使用 '%' 运算符使用传统字符串格式的正确方法是使用 printf 样式的格式字符串(此处的 Python 文档:http://docs.python.org/2/library/string.html#format-string-syntax):

    "'%s' is longer than '%s'" % (name1, name2)
    

    但是,'%' 运算符 will probably be deprecated in the future。新的PEP 3101 处事方式是这样的:

    "'{0}' is longer than '{1}'".format(name1, name2)
    

    【讨论】:

    • scnr:“将来可能会被弃用”到目前为止还没有发生(Python 3.5)。旧的 '%' 语法在 3.1 中没有被弃用,仅在 3.2 logging module learned how to format with the new style {} 中被弃用。突然 3.5 带来了PEP 461: % formatting for bytes。这让我觉得% 还会持续很长时间。
    • % 更简洁。很高兴它留在我们身边。
    • 我同意。 % 更简洁,删除不会给语言带来任何好处。
    • @LenarHoyt 你对 f 弦的感觉如何?我无法想象"'%s' is longer than '%s'" % (name1, name2)f"'{name1}' is longer than '{name2}'" 更简洁
    • 我完全赞成 f-strings,但它们太新了,你不能在超过一年的项目中使用它们
    【解决方案3】:

    除了其他两个答案,我认为最后两个条件的缩进也不正确。 条件是一个名字比另一个名字长,他们需要以'elif'开头并且没有缩进。如果你把它放在第一个条件中(通过从边缘给它四个缩进),它最终是矛盾的,因为名称的长度不能同时相等和不同。

        else:
            print ("The names are different, but are the same length")
    elif len(name1) > len(name2):
        print ("{0} is longer than {1}".format(name1, name2))
    

    【讨论】:

      【解决方案4】:

      对我来说,这个错误是在我尝试将元组传递给字符串格式方法时引起的。

      I found the solution from this question/answer

      复制并粘贴链接中的正确答案(不是我的作品)

      >>> thetuple = (1, 2, 3)
      >>> print "this is a tuple: %s" % (thetuple,)
      this is a tuple: (1, 2, 3)
      

      制作一个以感兴趣的元组作为唯一项的单例元组, 即 (thetuple,) 部分,是这里的关键。

      【讨论】:

      • 我宁愿使用以下语句之一将元组转换为字符串:print("this is a tuple: %s" % str(thetuple))print("this is a tuple: %s" % repr(thetuple))
      【解决方案5】:

      就我而言,这是因为我只需要一个 %s,我缺少值输入。

      【讨论】:

      • @ParisNakitaKejser,那么如何获取单个 %s 的输入参数?
      【解决方案6】:

      我也遇到了这个错误,

      _mysql_exceptions.ProgrammingError: not all arguments converted during string formatting 
      

      但列表参数效果很好。

      我使用 mysqlclient python 库。该库似乎不接受元组参数。传递['arg1', 'arg2'] 之类的列表参数将起作用。

      【讨论】:

        【解决方案7】:

        正如其他一些答案中指出的那样,存在多种问题。

        1. 正如 nneonneo 所指出的,您正在混合使用不同的字符串格式化方法。
        2. GuyP 指出,您的缩进也已关闭。

        我提供了 .format 的示例以及将元组传递给 %s 的参数说明符。在这两种情况下,缩进都已修复,因此大于/小于检查超出了长度匹配时的范围。还将后续 if 语句更改为 elif,因此它们仅在之前的同一级别语句为 False 时运行。

        使用 .format 格式化字符串

        name1 = input("Enter name 1: ")
        name2 = input("Enter name 2: ")
        len(name1)
        len(name2)
        if len(name1) == len(name2):
            if name1 == name2:
                print ("The names are the same")
            else:
                print ("The names are different, but are the same length")
        elif len(name1) > len(name2):
            print ("{0} is longer than {1}".format(name1, name2))
        elif len(name1) < len(name2):
            print ("{0} is longer than {1}".format(name2, name1))
        

        使用 %s 和元组进行字符串格式化

        name1 = input("Enter name 1: ")
        name2 = input("Enter name 2: ")
        len(name1)
        len(name2)
        if len(name1) == len(name2):
            if name1 == name2:
                print ("The names are the same")
            else:
                print ("The names are different, but are the same length")
        elif len(name1) > len(name2):
            print ("%s is longer than %s" % (name1, name2))
        elif len(name1) < len(name2):
            print ("%s is longer than %s" % (name2, name1))
        

        【讨论】:

          【解决方案8】:

          视图中的 django 原始 sql 查询

          "SELECT * FROM VendorReport_vehicledamage WHERE requestdate BETWEEN '{0}' AND '{1}'".format(date_from, date_to)
          

          models.py

          class VehicleDamage(models.Model):
              requestdate = models.DateTimeField("requestdate")
              vendor_name = models.CharField("vendor_name", max_length=50)
              class Meta:
                  managed=False
          

          views.py

          def location_damageReports(request):
              #static date for testing
              date_from = '2019-11-01'
              date_to = '2019-21-01'
              vehicle_damage_reports = VehicleDamage.objects.raw("SELECT * FROM VendorReport_vehicledamage WHERE requestdate BETWEEN '{0}' AND '{1}'".format(date_from, date_to))
              damage_report = DashboardDamageReportSerializer(vehicle_damage_reports, many=True)
              data={"data": damage_report.data}
              return HttpResponse(json.dumps(data), content_type="application/json")
          

          注意:使用 python 3.5 和 django 1.11

          【讨论】:

            【解决方案9】:

            在 python 3.7 及更高版本中,有一种新的简单方法。它被称为 f 弦。语法如下:

            name = "Eric"
            age = 74
            f"Hello, {name}. You are {age}."
            

            输出:

            Hello, Eric. You are 74.
            

            【讨论】:

              【解决方案10】:

              对我来说,由于我在一次打印调用中存储了许多值,因此解决方案是创建一个单独的变量来将数据存储为元组,然后调用打印函数。

              x = (f"{id}", f"{name}", f"{age}")
              print(x) 
              

              【讨论】:

                【解决方案11】:

                最简单的方式将字符串数字类型转换为整数

                number=89
                number=int(89)
                

                【讨论】:

                  【解决方案12】:

                  请记住,此错误也可能是由于忘记引用变量引起的

                  "this is a comment" % comment #ERROR
                  

                  而不是

                  "this is a comment: %s" % comment
                  

                  【讨论】:

                    猜你喜欢
                    • 2015-01-21
                    • 2021-08-19
                    • 2015-10-28
                    • 2013-10-21
                    • 1970-01-01
                    • 2015-03-30
                    • 1970-01-01
                    相关资源
                    最近更新 更多