【问题标题】:Accessing global dictionaries访问全局字典
【发布时间】:2021-05-06 08:08:25
【问题描述】:

我认为对此没有太多解释,问题很简单。我收到一条错误消息 编辑:我在底部添加了完整的错误回溯。

错误:

"if i in items:
NameError: name 'items' is not defined"

代码:

class Cart:
items = {}
def addToCart(item):
    global items
    for i in item:
        if i in items:
            items[i] += item[i]
        else:
            items.update(item)
            
def removeFromCart(item):
    global items
    for i in item:
        if i in items and items[i] > 1:
            items[i] -= 1
        elif i in items and items[i] <= 1:
            items.pop(i, None)

函数是如何调用的:

...
from .cart import Cart
...
@action(detail=True, methods=["POST"])
def addToCart(self, request, pk=None):
    item = request.data['item']
    Cart.addToCart(item)
    response = Cart.items
    return Response(response, status = status.HTTP_200_OK)

内部服务器错误:/api/Orders/1/addToCart/ 回溯(最近一次通话最后): 文件“/home/bigmac/anaconda3/lib/python3.7/site-packages/django/core/handlers/exception.py”,第 34 行,在内部 响应 = get_response(请求) _get_response 中的文件“/home/bigmac/anaconda3/lib/python3.7/site-packages/django/core/handlers/base.py”,第 115 行 response = self.process_exception_by_middleware(e, request) _get_response 中的文件“/home/bigmac/anaconda3/lib/python3.7/site-packages/django/core/handlers/base.py”,第 113 行 响应 = Wrapped_callback(request, *callback_args, **callback_kwargs) 文件“/home/bigmac/anaconda3/lib/python3.7/site-packages/django/views/decorators/csrf.py”,第 54 行,在 Wrapped_view 返回 view_func(*args, **kwargs) 文件“/home/bigmac/anaconda3/lib/python3.7/site-packages/rest_framework/viewsets.py”,第 125 行,在视图中 return self.dispatch(request, *args, **kwargs) 文件“/home/bigmac/anaconda3/lib/python3.7/site-packages/rest_framework/views.py”,第 509 行,在调度中 响应 = self.handle_exception(exc) 文件“/home/bigmac/anaconda3/lib/python3.7/site-packages/rest_framework/views.py”,第 469 行,在 handle_exception self.raise_uncaught_exception(exc) 文件“/home/bigmac/anaconda3/lib/python3.7/site-packages/rest_framework/views.py”,第 480 行,在 raise_uncaught_exception 中 提高 exc 文件“/home/bigmac/anaconda3/lib/python3.7/site-packages/rest_framework/views.py”,第 506 行,在调度中 响应 = 处理程序(请求,*args,**kwargs) 文件“/home/bigmac/Documents/Bernard_Quests/ALUTA3.0/ALUTA/api/views.py”,第 89 行,在 addToCart Cart.addToCart(项目) 文件“/home/bigmac/Documents/Bernard_Quests/ALUTA3.0/ALUTA/api/cart.py”,第 7 行,在 addToCart 如果我在项目中: NameError:名称“项目”未定义

【问题讨论】:

  • 首先,项目应该缩进以匹配 Cart 类。而且我们不知道两种方法是否属于 Cart 类(我认为是这样)。
  • 类属性不是全局的,我猜你的字典实际上应该是一个 instance 属性。此外,您的方法缺少 self 参数。
  • items 看起来像一个类属性。使用Cart.items 而不是全局变量。另外我假设方法addToCartremoveFromCart 属于该类,为什么不接受self 作为参数?或者至少使用classmethod 装饰器并接受cls 或其他名称的类?

标签: python python-3.x django python-2.7


【解决方案1】:

试试这个

您还应该在使用之前在全局范围内声明 items

class Cart:
   items = {}
   def addToCart(item):
       global items
       var_items = items
       for i in item:
          if i in var_items:
            items[i] += item[i]
          else:
            var_items.update(item)
            
   def removeFromCart(item):
      global items
      var_items = items
      for i in item:
         if i in var_items and var_items[i] > 1:
            items[i] -= 1
        elif i in var_items and var_items[i] <= 1:
            items.pop(i, None)

参考这个https://docs.python.org/3/reference/simple_stmts.html#the-global-statement

【讨论】:

  • 这将给出相同的错误,在使用之前在全局范围内没有定义项目。也许更重要的是,项目根本不应该是全局的,而是一个实例变量,在类中使用全局变量会破坏类的基本目的
猜你喜欢
  • 2013-05-18
  • 2017-07-13
  • 2011-11-19
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
相关资源
最近更新 更多