Python 2.7 检查Python字典中的所有值时出现意外结果:无 下面我们来考虑以下三个词典: topByClass = {'Real Estate': 'VNO', 'Construction': 'TOL', 'Utilities': 'EXC'} shouldPass = {'Real Estate': None, 'Construction': None, 'Utilities': 'EXC'} shouldFail = {'Real Estate': None, 'Construction': None, 'Utilities': None}

Python 2.7 检查Python字典中的所有值时出现意外结果:无 下面我们来考虑以下三个词典: topByClass = {'Real Estate': 'VNO', 'Construction': 'TOL', 'Utilities': 'EXC'} shouldPass = {'Real Estate': None, 'Construction': None, 'Utilities': 'EXC'} shouldFail = {'Real Estate': None, 'Construction': None, 'Utilities': None},python-2.7,dictionary,debugging,nonetype,pyalgotrade,Python 2.7,Dictionary,Debugging,Nonetype,Pyalgotrade,我希望将字典中的所有值都是None的情况与其他情况分开。(即前两个应该通过,而最后一个应该失败) 我在网上四处看看,尤其是在诸如。我在python控制台中测试了各种解决方案(在我的Mac上的virtualenv中运行python 2.7),下面的方法奏效了: not all(value == None for value in topByClass.values()) 无论有没有“not”,我都可以将“topByClass”和“shouldFail”这样的词典分开 >>> n

我希望将字典中的所有值都是None的情况与其他情况分开。(即前两个应该通过,而最后一个应该失败)

我在网上四处看看,尤其是在诸如。我在python控制台中测试了各种解决方案(在我的Mac上的virtualenv中运行python 2.7),下面的方法奏效了:

not all(value == None for value in topByClass.values())
无论有没有“not”,我都可以将“topByClass”和“shouldFail”这样的词典分开

>>> not all(value == None for value in shouldFail.values())
>>> False
>>> not all(value == None for value in topByClass.values())
>>> True
(反之亦然,如果没有)

问题是,当我运行python文件时,if语句的计算结果总是好像每个值都是None。我已经检查过是否可能弄错了字典,但是我在控制台中打印了dict“topByClass”,并直接粘贴在上面。你知道这是什么吗

编辑:

现在,使用上面的“如果”全部打印(“并非全部为空”)

如果您想看到getRank()或更多,我推荐PyAlgoTrade中的示例,因为影响问题的核心机制类似

编辑2: 我想如果有人试图复制上面链接的文件,我可能会提到这个。。。PyAlgoTrade的下载源模块不起作用。因此,您必须使用下载数据,以及从csv添加条形图:

feed = yahoofeed.Feed()
feed.addBarsFromCSV("SPY", "data/SPY.csv")
for industry, stocks in instrumentsByClass.items():
    for stock in stocks:
        feed.addBarsFromCSV(stock, "data/"+stock+".csv")
编辑3:添加了一些调试信息:

self.info(isinstance(topByClass, dict))
self.info(isinstance(topByClass.values(), list))
self.info(isinstance(topByClass.values()[0], str))
返回:

>>> True
>>> True
>>> True (False when the first value is None)
另外,根据我的评论,我想我会把这个放进去

self.info(list(topByClass.values()))
>>> [None, None, None, None]
最终编辑: 非常感谢所有回复的人,我想我会继续发布我的发现,以防任何人遇到类似的问题。。。 首先,识别问题的代码/输出:

self.info(list(shouldFail.values())
>>> [None, None, None]
self.info(list(topByClass.values())
>>>['VNO', 'TOL', 'EXC']
self.info(list(value is not None for value in topByClass.values()))
>>> [True, True, True]
self.info(any(value is not None for value in topByClass.values()))
>>> <generator object <genexpr> at 0x116094dc0>
将此更改为:

import numpy as np

它的行为与预期的一样。

由于您没有向我们展示导致失败的实际代码(我知道在生产环境中可能不可能),下面是一些关于如何在类层次结构中调试的原理,以及一个关于可能导致这种情况的理论:

  • 在测试实例之前,请添加print或logging语句来打印/记录实例的值。然后你可以看到它是否真的拥有你认为它拥有的价值(“当现实与理论发生冲突时,现实获胜”)。在bug搜索中,日志应该成为你的新朋友。不要相信你所有的假设(不要相信)。但是日志记录比研究大型类层次结构更快、更可靠
  • 小心在类层次结构的某个位置可能会发生意外的字符串转换(可能来自其他人编写的某个类,或意外使用了
    str
    repr
    ,例如在构造函数、setter或属性中,或在init或带有arg default
    ='None'
    而不是
    None
    的方法中):
    'None'!=None
    。这种错误很微妙,很隐蔽。如果你找到了它,你会边哭边笑

无论如何,祝您日志记录愉快,当您指出失败的比较时,请将日志记录输出发送给我们。追踪这些“存在的”错误非常重要,因为它们揭示了您的假设链或调试方法中的一些错误或盲点。这就是您学习的方式。

我想我添加了导致我失败的实际代码问题,以及一些与你的评论相关的调试代码。不管怎样,我很欣赏你的评论,当我找到原因时,一定会更新我的帖子!
import numpy as *
import numpy as np