用dict()或大括号指定字典参数

在matplotlib主页中,有一个由Nicolas Rougier编写的教程链接。 在题为“魔鬼在细节中”的教程部分,剧本:

http://www.loria.fr/~rougier/teaching/matplotlib/scripts/exercice_10.py

产生显示在网页上的数字。 该脚本的第48行是:

label.set_bbox(dict(facecolor='white', edgecolor='None', alpha=0.65 ))

如果我们通过以下方式替换此行

label.set_bbox({"facecolor": "white", "edgecolor": "None","alpha":0.65})

那么就不会考虑edgecolor请求。 我会认为上述两个陈述是相同的。 我已经向教程的作者Nicolas Rougier询问了这件事,他也很惊讶。 这是Matplotlib的错误吗?


您可以轻松确定两个dicts是否相同:

dict(facecolor='white', edgecolor='None', alpha=0.65 ) == 
    {"facecolor": "white", "edgecolor": "None", "alpha":0.65}

这是True

但是,如果将这些文字输入到Python解释器中,则生成的词典编号的值将以不同的顺序repr

{'alpha': 0.65000000000000002, 'facecolor': 'white', 'edgecolor': 'None'}
{'edgecolor': 'None', 'facecolor': 'white', 'alpha': 0.65000000000000002}

这可能会根据您使用的Python版本而有所不同,我相信在较新版本的Python中,它会随着解释器的运行而变化; 哈希播种是随机化的,以防止字典构造的恶意性能较差。 以上输出来自Python 2.6.6(Win32)。

Python dict是无序的,我们的意思是你不能依赖订单。 但是,在迭代字典时,元素必须以某种顺序出现。 这个顺序受项目插入顺序的影响,虽然不明显,但它们在这两个字典中以两种不同的顺序插入: dict()构造函数获取关键字字典,然后将其插入到构造的dict ,所以实际上第一个dict的元素插入两次! 首先按照您指定的顺序,然后按照该步骤构建的字典中的顺序排列。

假设:在matplotlib (或者你使用的Python版本)中有一些关心字典项目出现顺序的东西。事实上,由于第二个edgecolor键首先是它的,也许它跳过了第一个值,或者也许是后面的值之一有副作用,导致它覆盖edgecolor (例如, facecolor也会设置edgecolor以确保面之间没有间隙)。 这可能会被合理地称为一个错误,因为行为可能会根据关键字出现在字典中的顺序而有所不同。


如果您用以下内容替换该行:

label.set_bbox({"facecolor": "white", "alpha":0.65, "edgecolor": "None",})

它工作正常。

我认为这是set_alpha一个错误,或者可能是渲染器中的错误。

作为解决方法,您可以将行宽设置为0:

label.set_bbox({"facecolor": "white", "edgecolor": "None","alpha":0.65, 'lw':0})

这将确保该线不会被绘制,与颜色/ alpha是什么无关。

代码的工作方式,你传递set_bbox一个dict ,然后存储在_bbox 。 在绘制的时候,如果_bbox不是None (并且没有_bbox_patch ),则_bbox被传递给patches.bbox_artist ,它是一个函数(在docstring中标记为调试函数!),它使用dict来即时生成Rectangle对象(不返回!)。 set_ set_*中的set_*并在矩形中draw是错误的位置。

链接地址: http://www.djcxy.com/p/71007.html

上一篇: Specifying dictionary argument with dict() or braces matters in set

下一篇: Using FillRect() in C++