3

这是在谷歌应用程序引擎模型:我使用整数还是浮点数?

class Rep(db.Model): 
    mAUTHOR = db.UserProperty(auto_current_user=True) 
    mUNIQUE = db.StringProperty() 
    mCOUNT = db.IntegerProperty() 
    mDATE = db.DateTimeProperty(auto_now=True) 
    mDATE0 = db.DateTimeProperty(auto_now_add=True) 
    mWEIGHT = db.FloatProperty() 

所以,mCOUNT是整数,mWEIGHT是浮动。我计算商品的时代是这样的:

age1 = datetime.datetime.now() - rep.mDATE0 
    age_hour = float(age1.seconds)/3600 
    rep.mWEIGHT = float((rep.mCOUNT - 1)/(age_hour + 2)**1.5) 

但是当我尝试这样的查询:

QUERY = Rep.all() 
QUERY.filter("mAUTHOR =", user) 
QUERY.order("-mWEIGHT") 
RESULTS = QUERY.fetch(10)  

for result in RESULTS: 
    self.response.out.write("mUNIQUE: <b>%s</b> | " 
           "mWEIGHT: %f | " 
           "mCOUNT: %s | <br />" 
          % (result.mUNIQUE, 
           result.mWEIGHT, 
           # line 103        
           result.mCOUNT, 
           )) 

我得到的是

result.mCOUNT, 
TypeError: a float is required                

为什么线103 TypeError mCOUNT会浮动吗?顺便提一下,只有当该项目不在数据存储中时才会引发错误,并且该错误是由if loopelse子句第一次写入的。

你能帮我使用正确的类型吗?谢谢你的帮助。

----------------------------------------------------- 

编辑

我只注意到我有%f字符串格式化mWEIGHT和更改到%s似乎解决这个问题(但我不知道为什么。难道是因为mWEIGHT=None? ):

for result in RESULTS: 
    self.response.out.write("mUNIQUE: <b>%s</b> | " 
          # changing %f to %s appears to solve the problem. 
          "mWEIGHT: %f | " 
          "mCOUNT: %s | <br />" 
         % (result.mUNIQUE, 
          result.mWEIGHT if result.mWEIGHT is not None else 0.0, 
          result.mWEIGHT,           
          result.mCOUNT, 
            )) 

这里有一些值:

mUNIQUE: A | mWEIGHT: 0.299954933969 | mCOUNT: 2 | 
mUNIQUE: Z | mWEIGHT: 0.0 | mCOUNT: 1 | # With answer by TokenMacGuy 
mUNIQUE: R | mWEIGHT: None | mCOUNT: 1 | # with %f changed to %s 
mUNIQUE: P | mWEIGHT: None | mCOUNT: 1 | # with %f changed to %s 

任何建议如何将rep.mWEIGHT添加到else子句?

------------------------------------------------------------ 

整个代码如下:

K = [] 
    s = self.request.get('sentence')   
    K.append(s)        
    K = f2.remove_empty(K[0].split('\r\n'))  
    UNIQUES = f2.f2(K) 
    COUNTS = f2.lcount(K, UNIQUES)  

    C_RESULT = "no results yet"   

    for i in range(len(UNIQUES)):       
     C_QUERY = Rep.all() 
     C_QUERY.filter("mAUTHOR =", user) 
     C_QUERY.filter("mUNIQUE =", UNIQUES[i]) 
     C_RESULT = C_QUERY.fetch(1)     
     if C_RESULT: 
      rep = C_RESULT[0] 
      rep.mCOUNT+=COUNTS[i] 
      age1 = datetime.datetime.now() - rep.mDATE0 
      age_hour = float(age1.seconds)/3600 
      rep.mWEIGHT = float((rep.mCOUNT - 1)/(age_hour + 2)**1.5) 

      self.response.out.write("<b>rep.UNIQUE: %s</b>: <br />" 
      #      "rep.mCOUNT: %s <br />" 
            "rep.mWEIGHT: %s <br />" 
      #      "C_RESULT: %s <br />" 
      #      "rep: %s <br />" 
      #      "utc_tuple: %s <br />" 
      #      "mDATE0_epoch: %s <br />" 
            "rep.mDATE0: %s " 
            "age_hour: %s <br />" 
      #       
            % (rep.mUNIQUE, 
      #      rep.mCOUNT, 
            rep.mWEIGHT, 
      #      C_RESULT, 
      #      rep, 
      #      utc_tuple, 
      #      mDATE0_epoch, 
            rep.mDATE0, 
            age_hour,       
            ))      
      rep.put() 
     else: 
      rep = Rep() 
      rep.mCOUNT = COUNTS[i] 
      rep.mUNIQUE = UNIQUES[i] 

      rep.put()   

      self.response.out.write("<b>rep.UNIQUE: %s</b>: |" 
            "rep.mCOUNT: %s: <br />" 
           % (rep.mUNIQUE, 
            rep.mCOUNT,)) 

    QUERY = Rep.all() 
    QUERY.filter("mAUTHOR =", user) 
    QUERY.order("-mWEIGHT") 
    RESULTS = QUERY.fetch(10)  

    for result in RESULTS: 
     self.response.out.write("mUNIQUE: <b>%s</b> | " 
           "mWEIGHT: %f | " 
           "mCOUNT: %s | <br />" 
          % (result.mUNIQUE, 
           result.mWEIGHT, 
           result.mCOUNT, 
           )) 
+0

什么是其中引发异常的最后一个字符串插值类型和result.mWeight的价值? – 2010-11-15 00:36:09

+0

试试将它作为一个浮动。 '浮子(rep.mCount)'。 – Falmarri 2010-11-15 00:40:12

+0

@Falmarri:我只是试过这个;但它不起作用。我得到了同样的错误。谢谢。 – Zeynel 2010-11-15 01:17:07

回答

1

看起来你是偶尔不设置mWEIGHT。如何改变

for result in RESULTS: 
     self.response.out.write("mUNIQUE: <b>%s</b> | " 
           "mWEIGHT: %f | " 
           "mCOUNT: %s | <br />" 
          % (result.mUNIQUE, 
           result.mWEIGHT, 
           result.mCOUNT, 
           )) 

for result in RESULTS: 
     self.response.out.write("mUNIQUE: <b>%s</b> | " 
           "mWEIGHT: %f | " 
           "mCOUNT: %s | <br />" 
          % (result.mUNIQUE, 
           result.mWEIGHT if result.mWEIGHT is not None else 0.0, 
           result.mCOUNT, 
           )) 
+0

TokenMacGuy:我刚试过你的答案,它的工作原理!谢谢你的帮助。你能否给出更多的线索,为什么实际上'mCOUNT'会抛出错误?我该如何修复代码,以便我不必修补迭代?再次感谢? – Zeynel 2010-11-15 01:24:19

+0

你有一个多行表达式。实际上,为此确定正确的路线并不容易。特别是,在报告的错误之前,线路上经常会出现错误。 – SingleNegationElimination 2010-11-15 01:29:43

+0

'blah如果blah不是None 0.0'可以更简洁地写成'blah或0.0'。 – 2012-05-17 23:59:52