我有一个控制器用于处理购物车 AJAX 调用。在每次调用之初,它会初始化一个对象来处理实际的购物车功能逻辑。(这可能不是最有效的方法,但我的问题与实际的购物车部分无关。)
代码看起来像这样:
from webapp import request
from shopping_cart import Cart
from decorators import decorator
@decorator
def init_cart(f, *args, **kwargs):
shopping_cart = Cart()
return f(shopping_cart = cart)
@init_cart
def add_item(shopping_cart = None):
shopping_cart.add(request.params)
@init_cart
def remove_item(shopping_cart = None):
shopping_cart.remove(request.params)
等等。
这段代码存在于一个集中模块中,由多个应用程序导入和调用。各个应用程序中的代码如下:
from sharedlib.controllers import cart
from app.base import *
class CartController(BaseController):
def index(self, url = None):
set_content_type('text/javascript')
controller_method = getattr(cart, url)
if controller_method:
return controller_method()
else:
abort(404)
我的问题如下:
如果我想要init_cart装饰器在传递cart模块的同时,将收到的参数传递给被调用的控制器方法,我应该这样尝试:
@decorator
def init_cart(f, *args, **kwargs):
shopping_cart = Cart()
kwargs['shopping_cart'] = cart
return f(*args, **kwargs)
@init_cart
def add_item(shopping_cart = None):
shopping_cart.add(request.params)
但是我遇到了一个异常,TypeError: add_item() got multiple values for keyword argument 'shopping_cart'
我并不完全理解这种行为:kwargs显然只有一个关于'shopping_cart'的键/值对。
此外,如果我尝试这样做:
@decorator
def init_cart(f, *args, **kwargs):
shopping_cart = Cart()
return f(cart)
@init_cart
def add_item(shopping_cart = None):
shopping_cart.add(request.params)
我遇到了错误 TypeError: add_item() takes exactly 1 argument (0 given)
我认为我可能没有理解装饰器在接收和传递参数时的行为方式 - 我假设如果 init_cart
使用了 (*args, **kwargs)
,那么被它修饰的函数可以使用任何一组参数进行调用,甚至没有参数。但事实似乎并非如此。
除此之外,在之前的例子中,方法如何接收多个值作为 shopping_cart
参数呢?
Cart
返回一个元组或其他类型的数据,那么它可能会出现错误吗? - Joran BeasleyCart
是一个被初始化的类。想法是使用shopping_cart
变量来传递在每个请求中使用的Cart
实例。 - Michael Schuller