【问题标题】:Do I use integer or float?我使用整数还是浮点数?
【发布时间】:2011-05-09 23:54:54
【问题描述】:

这是 Google App Engine 中的模型:

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,
                                ))  

我在第 103 行得到一个TypeError,即

result.mCOUNT,
TypeError: a float is required                                                              

为什么 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,
                                ))   

【问题讨论】:

  • 最后一个字符串插值引发异常的result.mWeight的类型和值是什么?
  • 尝试将其转换为浮点数。 float(rep.mCount).
  • @Falmarri:我刚试过这个;但它没有用。我得到了同样的错误。谢谢。
  • @Luper Rouch:如何获取 mWEIGHT 的类型和值?当我尝试时,我收到错误消息?有什么建议吗?
  • @Luper Rouch:我添加了一些值作为上面的编辑。

标签: python google-app-engine floating-point integer google-cloud-datastore


【解决方案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,
                                )) 

【讨论】:

  • TokenMacGuy:我刚试过你的答案,它有效!谢谢你的帮助。您能否提供更多线索,为什么实际上mCOUNT 会抛出错误?我怎样才能修复代码,这样我就不必修补迭代?再次感谢?
  • 你有一个多行表达式。实际上,为此获得正确的线路并不容易。尤其是报错之前的行经常会出现错误。
  • blah if blah is not None else 0.0 可以更简洁地写成blah or 0.0
猜你喜欢
  • 1970-01-01
  • 2019-04-16
  • 2013-05-07
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2018-03-20
相关资源
最近更新 更多