我编写了这个包,用于监视终端中的网络连接的状态,因为我的网络连接一次会中断几分钟,然后恢复。我认为它可以在其他应用中使用。
我正在寻找任何关于如何改进或扩展这个包的任何可能的建议。
我所关注的问题如下:
#!/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()发布于 2015-11-09 17:15:08
将sleep导入为_sleep是一项棘手的工作。做一个普通的import time要容易得多,然后在您的sleep函数中引用time.sleep。不需要奇数化名,也不会被改写。
这一职能不起任何作用:
def _handle_timeout(signum, frame):
return
signal.signal(signal.SIGALRM, _handle_timeout)
signal.alarm(seconds)它将立即返回,以下两行将永远不会执行。
如果可以设置TIMEOUT,那么它不是常量,而是类级变量。将它直接放在类定义之后,然后您可以轻松地直接分配它,而不需要求助于global关键字。您也不需要将它作为参数传递给@timeout,您可以直接在那里使用NetworkStatus.timeout。
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_online和if_offline..。这些包装纸是做什么用的?它们似乎过于通用,无法实现一个小目标(只有在网络处于联机/脱机状态时才运行一个功能。将这些特定于函数,而不是将函数作为参数传递会更有意义。你有很多需要这个构造的功能吗?看上去你好像没在这里用过。
我会把mainloop重命名为run,或run_test。mainloop是一个通用名称,它没有告诉我们任何信息。此外,不需要将结果存储在up中。你可以直接评估:
if self.is_online():既然我在这里,我注意到您从未将任何关键字参数作为kw**传递。实际上,您从不使用它们,而只是使用字符串文本:
socket.gethostbyname(kw.get('remote_server', 'www.google.com')) 这是很糟糕的练习!这些值应该是常量或类属性。您还应该删除所有不必要的kw**参数。为什么让用户传递永远不会用于任何事情的值?
https://codereview.stackexchange.com/questions/110263
复制相似问题