TypeError:无法将'int'对象隐式转换为str(python)

Posted

技术标签:

【中文标题】TypeError:无法将\'int\'对象隐式转换为str(python)【英文标题】:TypeError: Can't convert 'int' object to str implicitly(python)TypeError:无法将'int'对象隐式转换为str(python) 【发布时间】:2015-05-11 05:03:03 【问题描述】:

已解决和修复 我该如何关闭它? :D

我最近一直在不停地为我的 聊天机器人,偶尔会遇到需要帮助的问题。 我已经查看了其他建议的线程。

简短说明:

试图让它选择一个介于 1 和 n 之间的数字。用户可以执行的命令 使用将是 /roll 20,这将返回 1-20。我试图在 n = integer 时让 args 替换 random.randint(n)。对不起,如果我的解释不好。每天都在不停地工作。

尝试前的原始代码(python):

  elif used_prefix and cmd.lower() == "roll" and self.rank(user) >= 1:
      args = args.lower()
      if len(args) == 0: post("Select a dice amount(6,8,10,20)")
      else:
        if args == "6": post("Rolled %s" % random.randint(1,6))
        elif args == "8": post("Rolled %s" % random.randint(1,8))
        elif args == "10": post("Rolled %s" % random.randint(1,10))
        elif args == "20": post("Rolled %s" % random.randint(1,20))
        else: post("Select a dice amount(6,8,10,20")

尝试后的最终结果代码(Python):

elif used_prefix and cmd.lower() == "roll" and self.rank(user) >= 1:
  args = args.lower()
  n = args.lower()
  if len(args) == 0: post("Select a dice amount(6,8,10,20)")
  else:
    post("Rolled %s" % str(random.randint(1,n)))

追溯

    [STATUS] Setting status Online...
    [LOAD] Loading Errors...
    [LOAD] Loading Locks...
    [SAVE] Appending default...
    Connected 
    Connected 
    Youcoldyet(4)-[devlcars]:[/roll 20](Monday, 11 May 2015, 01:07:23 AM)
    [ERR] Fatal error.
    (C:\Python34\lib\random.py:218) Can't convert 'int' object to str implicitly
    Traceback (most recent call last):
      File "C:\Users\Administrator\Downloads\hmm\bot.py", line 575, in <module>
        TestBot.easy_start(rooms, "Hidden", "Hidden")
      File "C:\Users\Administrator\Downloads\hmm\ck.py", line 1278, in easy_start
        self.main()
      File "C:\Users\Administrator\Downloads\hmm\ck.py", line 1254, in main
        con._feed(data)
      File "C:\Users\Administrator\Downloads\hmm\ck.py", line 550, in _feed
        self._process(food.decode().rstrip("\r\n")) #numnumz ;3
      File "C:\Users\Administrator\Downloads\hmm\ck.py", line 560, in _process
        getattr(self, func)(args)
      File "C:\Users\Administrator\Downloads\hmm\ck.py", line 670, in rcmd_u
        self._callEvent("onMessage", msg.user, msg)
      File "C:\Users\Administrator\Downloads\hmm\ck.py", line 957, in _callEvent
        getattr(self.mgr, evt)(self, *args, **kw)
      File "C:\Users\Administrator\Downloads\hmm\bot.py", line 447, in onMessage
        post("Rolled %s" % str(random.randint(1,n)))
      File "C:\Python34\lib\random.py", line 218, in randint
        return self.randrange(a, b+1)
    TypeError: Can't convert 'int' object to str implicitly

[96m[SAV][0m Saving Rooms..
[STATUS] Setting status Offline...
Waiting 30 seconds for you to read the error..

我能做什么和尝试:

我正在尝试用 args 替换 random.randint(n)n = 整数。我可以尝试做n = args.lower() 但是,当我这样做时,它返回了一个值错误,因为我是 无法选择第二个选项,这将迫使 用户使用命令/roll n, n。我想过尝试 将新代码设置为random.randint(1,n) 然后设置n = args.lower(),这可能会允许滚动选择。

更新

尝试了我的想法,它只是返回:

TypeError: Can't convert 'int' object to str implicitly

我什至将行改为post("Rolled %s" % str(random.randint(1,n))),但失败了

哦,如果您想知道这是用于角色扮演目的的滚动命令 欢迎任何和所有反馈/建议。我希望能解决这个问题。

【问题讨论】:

如果您不只是删除错误消息,而且还向我们展示了整个堆栈跟踪以及导致错误的行号,那么帮助您会容易得多。 @ReutSharabani Post 通过聊天室而不是控制台的机器人发送消息。做这个SSCCE很难。 【参考方案1】:

randint(a, b) 需要两个整数,但你给它一个整数和一个字符串。

您应该将第二个参数转换为整数,而不是将randint 的结果转换为字符串:

    post("Rolled %s" % random.randint(1,int(n)))

如果n 不能被解析为整数(即​​“/roll foo”),这将抛出一个ValueError

澄清:

错误消息有点令人困惑,因为当您调用 random.randint(a,b) 时发生的情况是,该方法将调用 random.randrange(a, b+1) 而不对其参数进行任何类型检查,从而导致 (C)Python 抛出关于不存在的错误能够将整数1 转换为字符串(因为b 是字符串)。

如果您执行以下操作,您可以自己看到:

Python 3.4.3 (default, Apr 13 2015, 22:30:47) 
[GCC 4.6.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> "8" + 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly

如果我们尝试调用random.randrange(a, "9"),我们会得到一个正确的错误:

>>> random.randrange(1, "9")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.4/random.py", line 191, in randrange
    raise ValueError("non-integer stop for randrange()")
ValueError: non-integer stop for randrange()

如果我们也调用random.randint(1, "8"),这可能会发生。

请随时向 Python issue tracker 提交有关此问题的错误

【讨论】:

太棒了!我不知道这就是它的预期。所以每当我做类似的事情时,我必须总是添加第二个参数? 我明白了。这解释了我看到的File "C:\Python34\lib\random.py", line 218, in randint return self.randrange(a, b+1)!感谢您的澄清。我会确保将其提交给问题跟踪器!还有一种方法可以防止出现值错误吗?我试过if args != int: post("Error. Please select an integer") 但是,它也发布整数。我觉得如果我把这个问题留在那里它是不完整的,因为它会导致崩溃。 看看here 了解如何使用 try/except 来做到这一点【参考方案2】:

问题出在这个调用中:

randint(1,n)

这里的 n 是一个字符串,randint 期望它是一个 int。我同意错误信息有点误导。

【讨论】:

我还是 python 新手,所以很容易让我感到困惑。谢谢你的解释!【参考方案3】:

您需要将n 转换为整数,然后才能在random.randint(1,n) 中使用它。

您可以使用random.randint(1, int(n))

【讨论】:

非常感谢!现在我明白了,我必须始终为类似情况添加第二个参数。

以上是关于TypeError:无法将'int'对象隐式转换为str(python)的主要内容,如果未能解决你的问题,请参考以下文章

Python3 错误:TypeError:无法将“字节”对象隐式转换为 str

C# Unity 无法将浮点类型隐式转换为 int [关闭]

将一个元素元组(int)转换为str

Python- TypeError:无法将系列转换为 <class 'int'>

C#错误(无法将类型'string'隐式转换为'int')[重复]

无法将类型“int”隐式转换为 dbDataSet