V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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 · 2016-02-28 20:50:21 +08:00 · 2622 次点击
    这是一个创建于 3191 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    第 1 条附言  ·  2016-02-29 20:07:14 +08:00
    给大家带来麻烦了,可能我说的不太清楚

    这个监控程序是一直跑在服务器上的,并且该商品上架和下架是经常出现的。所以如何处理这两种状态,并发送邮件是我想要解决的问题。意味着程序并不是实现一次就停止运行的。
    12 条回复    2016-02-29 20:20:21 +08:00
    est
        1
    est  
       2016-02-28 20:52:31 +08:00
    再立一个 is_sent 的 flag 就行了。
    ElegantOfKing
        2
    ElegantOfKing  
    OP
       2016-02-28 20:54:34 +08:00
    @est 能否麻烦您说得详细一点?我现在还一头雾水,想不到什么具体的思路 。
    zangxixi
        3
    zangxixi  
       2016-02-28 21:01:13 +08:00
    可以用数据库保存信息呀,每次发送邮件后就保存下,每次判断的时候就到数据库查一把
    billgreen1
        4
    billgreen1  
       2016-02-28 21:48:07 +08:00
    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
        5
    gamexg  
       2016-02-29 08:19:51 +08:00 via Android
    你需要保存商品的状态,如果这次抓取时和上次保存的一致就直接跳过。
    ElegantOfKing
        6
    ElegantOfKing  
    OP
       2016-02-29 12:23:34 +08:00
    @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
        7
    ElegantOfKing  
    OP
       2016-02-29 12:24:10 +08:00
    @gamexg

    谢谢提供思路,我尝试一下
    billgreen1
        8
    billgreen1  
       2016-02-29 12:35:19 +08:00
    @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
        9
    ElegantOfKing  
    OP
       2016-02-29 19:08:43 +08:00
    @zangxixi 这个思路感觉有点 BUG 。假如我发送邮件后存到了数据库,再次发送的时候,向数据库查询。假如说该商品再次缺货,然后再次上架,估计有点难处理。
    ElegantOfKing
        10
    ElegantOfKing  
    OP
       2016-02-29 19:09:00 +08:00
    @billgreen1 感谢您的回复,我尝试一下`
    ElegantOfKing
        11
    ElegantOfKing  
    OP
       2016-02-29 20:02:15 +08:00
    @billgreen1
    额,貌似有点问题?
    当我正确运行一次后, email_sent 变为 True ,这点可以实现。
    但是一旦 email_sent 变为 True 之后,无论 item_变量怎么改变, should_sent_mail()函数会一直 return False 。那么就意味着这个程序,只能运行一次?
    edwardlol
        12
    edwardlol  
       2016-02-29 20:20:21 +08:00
    @ElegantOfKing 按照这个逻辑 应该要在改变 item_的时候同时改变 email_sent 吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2678 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:50 · PVG 11:50 · LAX 19:50 · JFK 22:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.