2010-03-21 27 views
3

我收到的Python误以为浮动字符串

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

同时使用

Gambler.pot += round(self.bet + self.money * 0.1) 

哪里锅,赌,和金钱都是双打(或至少应该是)。我不确定这是不是另一个Eclipse的东西,但我如何获得编译的线?

其中betmoney被初始化代码:

class Gambler: 
    money = 0 
    bet = 0 

测试用例:

number = 0 
print("Here, the number is a {0}".format(type(number))) 
number = input("Enter in something: ") 
print("But now, it has turned into a {0}".format(type(number))) 

从测试情况下的输出:

Here, the number is a <class 'int'> 
Enter in something: 1 
But now, it has turned into a <class 'str'> 

显然,输入()被其更改为一个字符串。

EDIT:与

self.bet = int(self.bet.strip()) 

最后固定的问题(我认为)用户输入值之后。虽然我不知道,如果这对解决问题:)

由丹尼尔·摹:更好的解决方案

self.bet = float(input("How much would you like to bet? $")) 
+1

请显示self.bet和self.money初始化的代码。 – GreenMatt 2010-03-21 01:47:46

+1

你还没有证明这些不是字符串。 – 2010-03-21 01:48:14

+1

这就够了,还是我应该发布更多的代码? – wrongusername 2010-03-21 01:48:47

回答

3

Python3.2 (py3k:77602)给出了这些错误信息:

 
>>> "1.2" * 0.1            #1 
Traceback (most recent call last): 
    File "", line 1, in 
TypeError: can't multiply sequence by non-int of type 'float' 
>>> "3.4" + 1.2 * 0.1           #2 
Traceback (most recent call last): 
    File "", line 1, in 
TypeError: Can't convert 'float' object to str implicitly 
>>> n = "42" 
>>> n += round(3.4 + 1.2 * 0.1)        #3 
Traceback (most recent call last): 
    File "", line 1, in 
TypeError: Can't convert 'int' object to str implicitly 

我怀疑你的错误消息,是因为你的实际值是字符串,而不是预期漂浮在类似的场景到#2,这与您的例外完全匹配。

如果你可以写一个testcase,这将是一个很大的帮助。


记住Py3.x的输入是相同的Py2.x的原料 _Input和Py2.x的输入消失(这相当于使用evai,你不要”不想做)。因此,3.x中的输入将始终返回一个字符串。使用INT转换:

n = int(input("Enter a number: ")) 

如果你想处理输入错误,再搭上ValueError异常,这是什么INT提出的错误:

try: 
    n = int(input("Enter a number: ")) 
except ValueError: 
    print("invalid input") 
else: 
    print("squared:", n*n) 
+1

我使用3.1.1。我会尽快写测试用例如果我可以:) – wrongusername 2010-03-21 01:58:11

+1

我做到了......问题似乎在于输入内容将其变为字符串 – wrongusername 2010-03-21 02:11:04

+1

感谢您添加额外的信息! – wrongusername 2010-03-21 02:29:37

3

如果任何Gambler.potself.betself.money已俨然成为字符串(因为他们设定的最佳方式到某个点的字符串),+将被视为意味着字符串连接,这会导致您看到的错误消息。

+1

它似乎self.bet有输入后:( – wrongusername 2010-03-21 02:12:57

0

正如在评论说,你已经显示的初始化局部变量为0.而是尝试类似于:

class Gambler: 
    def __init__(self): 
     self.bet = 0.0 
     self.money = 0.0 

    def calc_pot(self): 
     self.pot = round(self.bet + self.money * 0.1) 

g = Gambler() 
g.bet = 2.0 
g.money = 5.0 
g.calc_pot() 

print "Pot = %f" % (g.pot) 

另外,make sur没有什么东西可以把这些成员变成字符串。

6

input()在3.x中只返回字符串。程序员的工作是将其传递给一个数字构造函数,以便将其变成一个数字。

+1

是的......谢谢! – wrongusername 2010-03-21 02:17:13

+2

我相信在3.x中的input()与在2.x中的raw_input()相同 – MatrixFrog 2010-03-21 02:17:15

+1

@MatrixFogg:当我尝试这样做时,我得到'NameError:全局名'raw_input'没有被定义'。难道我做错了什么? – wrongusername 2010-03-21 02:20:31

2

在Python 3.x中,input()取代了Python 2.x的raw_input()。因此,函数input()返回用户输入的确切字符串(如raw_input()在先前版本中所做的那样)。

要获得的Python 2.x的行为,你可以做

number = eval(input("Please enter a number: ")) 

不过,我不会建议使用“EVAL”,因为用户可以把他们想要的Python有任何线,这是可能不是你想要的。如果你知道你想要一个float,只是告诉Python的这就是你想要的东西:

number = float(input("Please enter a number: ")) 
+1

谢谢!这也适用于我! – wrongusername 2010-03-21 02:22:18

4

你初始化锅?您是否尝试过存储中间结果来追踪问题来自哪里?最后,你知道pdb吗?这可能是一个很大的帮助。

class Gambler: 
    pot = 0.0 
    def __init__(self, money=0.0) 
     self.pot = 0.0 
     self.bet = 0.0 
     self.money = money 

    def update_pot(self): 
     import pdb; pdb.set_trace() 
     to_pot = self.bet + self.money * 0.1 
     to_pot = round(to_pot) 
     Gambler.pot = Gambler.pot + to_pot 

当执行set_trace()行时,您将收到提示。当你到达那里时,试着看看当前的值。

(Pdb) h # help 
(Pdb) n # go to next statement 
(Pdb) l # list source code 
... 
(Pdb) to_pot 
... 
(Pdb) self.bet 
... 
(Pdb) self.money 
... 
(Pdb) Gambler.pot 
... 
(Pdb) c # continue 
+3

+1。调试器未被充分利用。 – 2010-03-21 02:22:47

+1

+1不知道调试器 – wrongusername 2010-03-21 02:25:58