TypeError: get() takes exactly 1 argument (0 given)
我知道如果你在类方法上使用装饰器,你需要在装饰器中设置self = None.
这是代码:
schema = {'pID': int,'description': str}def valIDator(schema): def _valIDator(f): @wraps(f) def wrapped(self=None): print f check = all([isinstance(v,schema[k]) for k,v in f().iteritems() if v]) return f() if check else None return wrapped return _valIDatorclass Data(object): ''' Base request wrapper to use for all APIs accepts a valIDator schema to check the type of response values. ''' def __init__(self,base_url,schema=None,deBUG=False): self.base_url = base_url self.schema = schema def __getattr__(self,key): new_base = self.append_to_url(self.base_url,key) return self.__class__(base_url=new_base) def __getitem__(self,key): return self.__getattr__(key) # def __call__(self,**kwargs): # self.base_url = self.base_url[:-1] # return self.get(self.base_url,**kwargs) def append_to_url(self,param): return '{}{}/'.format(base_url,param) @valIDator(schema) def get(self,**kwargs): try: r = requests.get(self.base_url[:-1],**kwargs) r.raise_for_status() return r.Json() except requests.exceptions.ConnectionError as e: raise errors.APIError(e) except requests.exceptions.httpError as e: raise errors.APIError(e)product_details = Data('my_API_url',schema).shoes['10'].get()
我认为这是因为在我的验证器中我初始化f(),这是get函数期待自我.我试图在装饰器中将self传递给f()但是也会产生相同的错误.我甚至试图在__call__方法上初始化get函数,但是得到get函数需要1 arg和2.
必须有一种更有效或更加方便的方法来实现这一目标.我知道有一个名为妖娆的图书馆可以进行大量的验证,但我想尝试一些简单的学习练习.
解决方法 这不是被包裹的函数调用失败,而是获取调用.你调用它的所有地方就像f(),即没有任何参数.一个工作示例,正确地将自身参数传递给包装函数:
import functoolsdef valIDator(schema): def _valIDator(f): @functools.wraps(f) def wrapper(self): # pass self to the wrapped function result = f(self) return 'wrapped {} {}'.format(schema,result) return wrapper return _valIDatorclass Data(object): @valIDator('test') def get(self): return 'data'print(Data().get())# wrapped test data
虽然您可以直接使用自我或其他此类特定参数,但使用* args和** kwargs会使装饰器更加灵活,例如使它也可用于非约束函数:
import functoolsdef valIDator(schema): def _valIDator(f): @functools.wraps(f) def wrapped(*args,**kwargs): # pass aribitrary args to the wrapped function # for greater flexibility result = f(*args,**kwargs) return 'wrapped {} {}'.format(schema,result) return wrapped return _valIDatorclass Data(object): @valIDator('test') def get(self): return 'data'@valIDator('test2')def get(): return 'data2'print(Data().get())# wrapped test dataprint(get())# wrapped test2 data2总结
以上是内存溢出为你收集整理的python – 类中的decorator没有得到值全部内容,希望文章能够帮你解决python – 类中的decorator没有得到值所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)