我正在编一个关于codechalleng.es的小程序,完全没有想法了。 问题如下: task description
我需要写一个类,返回布尔真/假,无论提升是否过期。 它是通过调用getter promotion.expired属性来测试的(请参阅最后的测试)
from datetime import datetime, timedelta
NOW = datetime.now() # defined here for test compatilibity (time)
class Promo:
""" docstring hehe"""
def __init__(self, name, expires):
self.name = name
self.setpromo(expires)
def checkpromo(self):
return self.expired
def setpromo(self, value):
self.expired = value < datetime.now()
expired = property(checkpromo, setpromo)
test_time = NOW + timedelta(days=1)
promotion_10 = Promo('promotion 10%', test_time)
现在它抛出了一个错误,我无法比较setter和datetime对象中的值。在我看来,当我们将test\u time(一个datetime对象)传递给setter时,它应该能够比较datetime和datetime——相反,程序说它是一个bool。不知道如何进行。谢谢你的洞察力
Traceback (most recent call last):
File "/tmp/simple_property.py", line 24, in <module>
promotion_10 = Promo('promotion 10%', test_time)
File "/tmp/simple_property.py", line 10, in __init__
self.setpromo(expires)
File "/tmp/simple_property.py", line 17, in setpromo
self.expired = value < datetime.now()
File "/tmp/simple_property.py", line 17, in setpromo
self.expired = value < datetime.now()
TypeError: '<' not supported between instances of 'bool' and 'datetime.datetime'
需要通过的测试:
from datetime import timedelta
import inspect
from simple_property import Promo, NOW
def test_promo_expired():
past_time = NOW - timedelta(seconds=3)
twitter_promo = Promo('twitter', past_time)
assert twitter_promo.expired
def test_promo_not_expired():
future_date = NOW + timedelta(days=1)
newsletter_promo = Promo('newsletter', future_date)
assert not newsletter_promo.expired
def test_uses_property():
assert 'property' in inspect.getsource(Promo)
我终于发现了这个问题—对于经历过这种setter/property()行为的人来说,这可能很有趣(如果我不应该回答自己的问题/结束话题等,请纠正我。)
在我的示例中,属性expired与私有属性self同名。expired
将代码更改为后(仅在self中添加一个下划线。\u expired-更改名称以使其不与property()name重叠):
成功了!谢谢
编辑-添加优雅的decorator解决任务的方法(在将我的任务提交给codechaleng.es后作为答案提供)
相关问题 更多 >
编程相关推荐