2015-05-11 42 views
1

解决和修正 如何关闭呢? :d类型错误:无法转换“诠释”对象隐含STR(蟒蛇)

我一直没有停止最近在添加新的特性我 聊天机器人,偶尔遇到,我需要在援助问题 我看了其他建议的线程已经。

短解释:

试图让它选择1到n之间的数字。用户可以使用的命令是/ roll 20,这将返回1-20。我试图能够取代参数random.randint(n)n =整数。对不起,如果我的解释不好。经过不间断的工作。

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

原代码(蟒蛇)尝试之前

我能做些什么,并尝试:

我想能够得到参数传递给更换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)))它未能

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

+0

'post'是什么? –

+1

如果您不只是切断错误消息,而且还会显示整个堆栈跟踪以及导致错误的行号,那么这对您来说会更容易。 – kirelagin

+0

@ReutSharabani Post通过机器人发送消息而不是控制台。这个SSCCE很难做到。 – user3745348

回答

1

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

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

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

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

澄清:

错误消息是有点令人困惑,因为当你调用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

+0

真棒,它工作!我不知道这是如何期待它。所以每当我做类似的事情时,我总是要添加第二个参数? – user3745348

+0

我明白了。因此,在randint中解释了“文件”C:\ Python34 \ lib \ random.py“,第218行,返回self.randrange(a,b + 1)'我看到了!感谢您的澄清。我会确保将其提交给问题跟踪器!还有一种方法可以使某些东西可以防止值错误?我试过'如果参数!= int:post(“错误。请选择一个整数”)'但是,它也发布整数。我觉得如果我在那里保持这个问题是不完整的,因为它会导致崩溃。 – user3745348

+0

看看[这里](http://stackoverflow.com/questions/8075877/converting-string-to-int-using-try-except-in-python)如何做到这一点使用尝试/除了 – Raniz

0

在使用random.randint(1,n)之前,您需要将n转换为整数。

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

+0

谢谢!现在我明白了,我必须总是为类似的情况添加第二个参数。 – user3745348

0

的问题是在这个调用:

randint(1,n) 

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

+0

我' m仍然是python的新手,所以事情往往让我很容易混淆。感谢您的解释! – user3745348

相关问题