首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >网络连接测试包

网络连接测试包
EN

Code Review用户
提问于 2015-11-09 16:54:50
回答 1查看 1.1K关注 0票数 6

我编写了这个包,用于监视终端中的网络连接的状态,因为我的网络连接一次会中断几分钟,然后恢复。我认为它可以在其他应用中使用。

我正在寻找任何关于如何改进或扩展这个包的任何可能的建议。

包装回购

我所关注的问题如下:

  1. 这个包裹是"Pythonic“吗?
  2. 该包是否包含任何明显的错误/错误/缺陷?
代码语言:javascript
复制
#!/usr/bin/env python


'''
This module is for checking a networks status.
'''

import socket
from time import sleep as _sleep
from functools import wraps
import errno
import os
import signal

TIMEOUT = 2

class NetworkStatus(object):
    def timeout(seconds=1, error_message=os.strerror(errno.ETIME)):
        def decorator(func):
            def _handle_timeout(signum, frame):
                return
                signal.signal(signal.SIGALRM, _handle_timeout)
                signal.alarm(seconds)
            def wrapper(*args, **kwargs):
                try:
                    result = func(*args, **kwargs)
                finally:
                    signal.alarm(0)
                return result

            return wraps(func)(wrapper)

        return decorator


    def set_timeout(self, t_out):
        '''
        Update the global variable TIMEOUT.
        '''
        global TIMEOUT
        TIMEOUT = t_out

    def sleep(self,delay):
        '''
        Sleep function with cleanup.
        '''
        try:
            _sleep(delay)
        except KeyboardInterrupt:
            exit()


    @timeout(TIMEOUT)
    def check(self, **kw):
        '''
        Check if the network is up.
        '''
        self.sleep(TIMEOUT)
        try:
            socket.gethostbyname(kw.get('remote_server', 'www.google.com'))
            return True
        except Exception:
            return False


    def online(self, **kw):
        '''
        return True is the network is UP.
        '''
        return self.check(**kw) is True


    def offline(self, **kw):
        '''
        return False if the network is DOWN.
        '''
        return self.online(**kw) is False


    def if_online(self, func, *args, **kw):
        if self.online():
            func(*args, **kw)

    def if_offline(self, func, *args, **kw):
        if self.offline():
            func(*args,**kw)


    def mainloop(self):
        '''
        Continuously check if the network is UP or DOWN.
        '''
        while True:
            up = self.check()
            if up:
                print 'Network is up'
            else:
                print 'network is down.'


if __name__ == '__main__':
    NetworkStatus().mainloop()
EN

回答 1

Code Review用户

发布于 2015-11-09 17:15:08

sleep导入为_sleep是一项棘手的工作。做一个普通的import time要容易得多,然后在您的sleep函数中引用time.sleep。不需要奇数化名,也不会被改写。

这一职能不起任何作用:

代码语言:javascript
复制
def _handle_timeout(signum, frame):
    return
    signal.signal(signal.SIGALRM, _handle_timeout)
    signal.alarm(seconds)

它将立即返回,以下两行将永远不会执行。

如果可以设置TIMEOUT,那么它不是常量,而是类级变量。将它直接放在类定义之后,然后您可以轻松地直接分配它,而不需要求助于global关键字。您也不需要将它作为参数传递给@timeout,您可以直接在那里使用NetworkStatus.timeout

代码语言:javascript
复制
class NetworkStatus(object):

    timeout = 2

online中,您将返回if self.online(**kw) is True,但这与返回self.online(**kw)已经是True相同。check只返回true或false。这里根本没有理由有两个单独的函数,只需将vague check函数重命名为is_online,然后直接从那里返回一个布尔值。然后还有offline,这一点也没有什么意义。如果您关心的是可读性,那么if not network.is_online()在没有特定函数的情况下是足够可读的。

下面还有if_onlineif_offline..。这些包装纸是做什么用的?它们似乎过于通用,无法实现一个小目标(只有在网络处于联机/脱机状态时才运行一个功能。将这些特定于函数,而不是将函数作为参数传递会更有意义。你有很多需要这个构造的功能吗?看上去你好像没在这里用过。

我会把mainloop重命名为run,或run_testmainloop是一个通用名称,它没有告诉我们任何信息。此外,不需要将结果存储在up中。你可以直接评估:

代码语言:javascript
复制
if self.is_online():

既然我在这里,我注意到您从未将任何关键字参数作为kw**传递。实际上,您从不使用它们,而只是使用字符串文本:

代码语言:javascript
复制
socket.gethostbyname(kw.get('remote_server', 'www.google.com'))        

这是很糟糕的练习!这些值应该是常量或类属性。您还应该删除所有不必要的kw**参数。为什么让用户传递永远不会用于任何事情的值?

票数 6
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/110263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档