2014-05-08 1 views
2

Я пытаюсь реализовать декоратор, чтобы повторить urllib2.urlopen n раз. Я не могу заставить декоратора работать. Когда я запустил его, я получаю следующую ошибку: Traceback (последний последний звонок): Файл «F: \ retry \ dec_class.py», строка 60, в x.getURLdata ('127.0.0.1') ТипError: Объект «NoneType» не может быть вызванКак retry urllib2.urlopen n раз

Может ли кто-нибудь дать мне руку, пожалуйста?

import serial, urllib2, time 
from functools import wraps 

import xml.etree.cElementTree as ET 
from xml.etree.cElementTree import parse 

class Retry(object): 

    default_exceptions = (Exception) 
    def __init__(self, tries, exceptions=None, delay=0): 

     self.tries = tries 
     if exceptions is None: 
      exceptions = Retry.default_exceptions 
     self.exceptions = exceptions 
     self.delay = delay 

    def __call__(self, f): 
     def fn(*args, **kwargs): 
      tried = 0 
      exception = None 

      while tried <= self.tries: 
       try: 
        return f(*args, **kwargs) 
       except self.exceptions, e: 
        print "Retry, exception: "+str(e) 
        time.sleep(self.delay) 
       tried += 1 
       exception = e 
       #if no success after tries, raise last exception 
       raise exception 
      return fn 


class getURL(object): 

    @Retry(2) 
    def getURLdata(self, IPaddress): 

     try: 
      f = urllib2.urlopen(''.join(['http://', IPaddress])) 
      f = ET.parse(f) 

      return f 

     except IOError, err: 
      print("L112 IOError is %s" %err) 
     except urllib2.URLError, err: 
      print("L114 urllib2.URLError is %s" %err) 
     except urllib2.HTTPError, err: 
      print("L116 urllib2.HTTPError is %s" %err) 
     except Exception, err : 
      print("L118 Exception is %s" %err) 


x = getURL() 

x.getURLdata('127.0.0.1') 

ответ

1

__call__ Ваш метод не возвращает fn. Вместо этого он неявно возвращает None, и поэтому None привязан к getURLdata.

+0

ОК, и как я исправлю это? –