推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
ElegantOfKing
V2EX  ›  Python

Python 变量控制问题

  •  1
     
  •   ElegantOfKing · Feb 28, 2016 · 3742 views
    This topic created in 3905 days ago, the information mentioned may be changed or developed.

    假如我监控某一个商品网页中的某个属性,当发现它从“ True ”变为“ False ”的时候,我调用 emai 控件发送一封邮件给目标邮箱。

    那么问题来了:
    假如我把这个程序放在服务器上,每 2 秒中对目标网页进行监视,那么在该商品未下架之前,程序将会一直以 2 秒钟为时间,向目标用户发送邮件。

    请问大家有什么思路来解决这个问题,使得只发送一封邮件吗?

    我初步的想法是一旦发送一封邮件后,直接将该属性强制改为'True',但是获取网站信息之后,仍然会变为'False',没有一点思路......

    Supplement 1  ·  Feb 29, 2016
    给大家带来麻烦了,可能我说的不太清楚

    这个监控程序是一直跑在服务器上的,并且该商品上架和下架是经常出现的。所以如何处理这两种状态,并发送邮件是我想要解决的问题。意味着程序并不是实现一次就停止运行的。
    12 replies  •  2016-02-29 20:20:21 +08:00
    est
    est
    Feb 28, 2016
    1
    再立一个 is_sent 的 flag 就行了。
    ElegantOfKing
    ElegantOfKing
    OP
    Feb 28, 2016
    2
    @est 能否麻烦您说得详细一点?我现在还一头雾水,想不到什么具体的思路 。
    zangxixi
    zangxixi
    Feb 28, 2016
    3
    可以用数据库保存信息呀,每次发送邮件后就保存下,每次判断的时候就到数据库查一把
    billgreen1
    billgreen1
    Feb 28, 2016
    4
    email_sent = False
    item_attribute = True
    should_send_email = (not item_attribute) and (not email_sent)

    if should_send_email:
    send_email(mail_content):
    email_sent = True
    gamexg
    gamexg
    Feb 29, 2016 via Android
    5
    你需要保存商品的状态,如果这次抓取时和上次保存的一致就直接跳过。
    ElegantOfKing
    ElegantOfKing
    OP
    Feb 29, 2016
    6
    @billgreen1
    按照您的操作,做了个小测试,发现还是继续运行啊。

    def send_mail():
    print('已经发送短信!')


    email_sent = False
    item_ = False
    should_send_email = (not email_sent) and (not item_)

    while True:
    if should_send_email:
    send_mail()
    email_sent = True
    ElegantOfKing
    ElegantOfKing
    OP
    Feb 29, 2016
    7
    @gamexg

    谢谢提供思路,我尝试一下
    billgreen1
    billgreen1
    Feb 29, 2016
    8
    @ElegantOfKing 你可以把 should_send_mail 定义为函数
    def should_send_mail(email_sent, item_):
    return (not item_) and (not email_sent)

    在 while 循环里面,
    while True:
    if should_send_email(email_sent, item_):
    send_mail()
    email_sent = True
    ElegantOfKing
    ElegantOfKing
    OP
    Feb 29, 2016
    9
    @zangxixi 这个思路感觉有点 BUG 。假如我发送邮件后存到了数据库,再次发送的时候,向数据库查询。假如说该商品再次缺货,然后再次上架,估计有点难处理。
    ElegantOfKing
    ElegantOfKing
    OP
    Feb 29, 2016
    10
    @billgreen1 感谢您的回复,我尝试一下`
    ElegantOfKing
    ElegantOfKing
    OP
    Feb 29, 2016
    11
    @billgreen1
    额,貌似有点问题?
    当我正确运行一次后, email_sent 变为 True ,这点可以实现。
    但是一旦 email_sent 变为 True 之后,无论 item_变量怎么改变, should_sent_mail()函数会一直 return False 。那么就意味着这个程序,只能运行一次?
    edwardlol
    edwardlol
    Feb 29, 2016
    12
    @ElegantOfKing 按照这个逻辑 应该要在改变 item_的时候同时改变 email_sent 吧
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   686 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 20:20 · PVG 04:20 · LAX 12:20 · JFK 15:20
    ♥ Do have faith in what you're doing.