【问题标题】:'NoneType' and 'float' Error - How to avoid NoneType'NoneType' 和 'float' 错误 - 如何避免 NoneType
【发布时间】:2020-06-19 22:13:07
【问题描述】:

我尝试构建我的代码,因此如果 NoneType 是结果,它将被转换为 0。但是,我似乎仍然没有通过下一个函数获得 None。这是为什么呢?

第 321 行错误,在 get_profit_loss_value_fees 中

result = self.get_profit_loss_value() - self.get_fees()

TypeError: 不支持的操作数类型 -: 'NoneType' 和 'float'

def get_profit_loss_value(self):
    if self.get_exit_cpu() > 0:
        if self.type == 'Long':
            result = self.get_entries().aggregate(
            get_profit_loss_value=Sum('amount', output_field=models.FloatField()
                                           ) * (self.get_exit_cpu() - self.get_entry_cpu()))['get_profit_loss_value']
            return 0 if result is None else result
        elif self.type == 'Short':
            ...
    else:
        return 0

def get_profit_loss_value_fees(self):
    result = self.get_profit_loss_value() - self.get_fees()
    return result

根据要求完整追溯:

Traceback (most recent call last):
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\core\handlers\base.py", line 145, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\core\handlers\base.py", line 143, in _get_response
    response = response.render()
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\response.py", line 105, in render
    self.content = self.rendered_content
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\response.py", line 83, in rendered_content
    return template.render(context, self._request)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\backends\django.py", line 61, in render
    return self.template.render(context)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\base.py", line 171, in render
    return self._render(context)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\base.py", line 163, in _render
    return self.nodelist.render(context)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\base.py", line 936, in render
    bit = node.render_annotated(context)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\base.py", line 903, in render_annotated
    return self.render(context)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\base.py", line 163, in _render
    return self.nodelist.render(context)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\base.py", line 936, in render
    bit = node.render_annotated(context)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\base.py", line 903, in render_annotated
    return self.render(context)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\base.py", line 936, in render
    bit = node.render_annotated(context)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\base.py", line 903, in render_annotated
    return self.render(context)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\defaulttags.py", line 209, in render
    nodelist.append(node.render_annotated(context))
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\base.py", line 903, in render_annotated
    return self.render(context)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\defaulttags.py", line 309, in render
    return nodelist.render(context)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\base.py", line 936, in render
    bit = node.render_annotated(context)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\base.py", line 903, in render_annotated
    return self.render(context)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\defaulttags.py", line 309, in render
    return nodelist.render(context)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\base.py", line 936, in render
    bit = node.render_annotated(context)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\base.py", line 903, in render_annotated
    return self.render(context)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\base.py", line 986, in render
    output = self.filter_expression.resolve(context)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\base.py", line 670, in resolve
    obj = self.var.resolve(context)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\base.py", line 795, in resolve
    value = self._resolve_lookup(context)
  File "C:\Users\winkl\tj3\venv\lib\site-packages\django\template\base.py", line 857, in _resolve_lookup
    current = current()
  File "C:\Users\winkl\tj3\portfolios\models.py", line 321, in get_profit_loss_value_fees
    result = self.get_profit_loss_value() - self.get_fees()
TypeError: unsupported operand type(s) for -: 'NoneType' and 'float'

【问题讨论】:

  • 你能发布整个回溯吗?
  • 您尚未显示来自get_profit_loss_value() 的所有回报。是否还有一条或多条返回 None 的路径?
  • 我想你就在这里,我认为“else: return 0”是解决这个问题的方法
  • 亲爱的未来程序员,这是一个总结 Traceback 就足够的情况,而完整的 Traceback 只是底部三行以上的噪音。
  • @quamrana 我也这么认为,但在请求后才发布

标签: python django python-3.x django-models nonetype


【解决方案1】:

self.type 有可能您没有检查或检查但没有返回任何内容。如果您不返回任何内容,python 将为您返回 None

因此,如果例如 self.get_exit_cpu() 大于 0,但 self.type 是您未检查的内容,例如 "Long Long",则 else 语句将不会执行并且不会手动返回任何内容 - 意思None 将被返回。

【讨论】:

  • 好点,我认为“else:return 0”正在与前线作战,但会对其进行测试!
  • 您的回答 100% 为我指明了正确的方向,并且数据库中有一些旧交易没有该字段的数据,因为现在这是一个强制 2 选项下拉字段。现在,我选择@quamrana 的答案,因为它可能会捕捉到意想不到的 NoneTypes - 如果可能的话,我似乎需要寻找太多路径。
  • 他的答案可能更好:) 更具可扩展性
  • @chuck2002 但我的回答也更像是在裂缝上粘贴。可以对其进行修改以告诉您何时返回 None,但仍然不知道为什么会发生。
【解决方案2】:

你总是可以在 def get_profit_loss_value(self): 周围做一个包装器

def get_profit_loss_value_or_None(self):
   # All code as now

def get_profit_loss_value(self):
    ret = self.get_profit_loss_value_or_None()
    return 0 if ret is None else ret

这也可以防止将来发生任何导致None 意外返回的更改。

【讨论】:

  • 这真的很有趣,不知怎的,这似乎是一个额外的步骤,但它也很有意义,因为这些 NoneType 似乎不断弹出。即使“如果结果为无,则返回 0”
  • 我是说您可以将精力集中在将None 转换为0 的地方。另请注意,您现有的函数可能具有没有return 的路径,这可能是隐含的return None
猜你喜欢
  • 2022-11-16
  • 2019-06-19
  • 1970-01-01
  • 1970-01-01
  • 2022-08-22
  • 2019-06-05
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
相关资源
最近更新 更多