我想拿两本字典并打印出它们的差异.此差异应包括键和值的差异.我已经创建了这个小片段,以使用unittest模块中的内置代码实现结果.然而,这是一个讨厌的黑客,因为我必须子类unittest.TestCase并提供一种runtest()方法来工作.此外,此代码将导致应用程序出错,因为它会AssertError在存在差异时引发.我真正想要的就是打印差异.
import unittest
class tmp(unittest.TestCase):
def __init__(self):
# Show full diff of objects (dicts could be HUGE and output truncated)
self.maxDiff = None
def runTest():
pass
_ = tmp()
_.assertDictEqual(d1, d2)
Run Code Online (Sandbox Code Playgroud)
我希望使用该difflib模块,但它看起来只适用于字符串.有没有办法解决这个问题并仍在使用difflib?
我想比较一对字典并使用"模糊"浮点比较或更好地使用numpy.allclose()这样做.但是,使用默认值==或!=在Python中使用dicts不会这样做.
我想知道是否有办法改变浮点比较操作(可能使用上下文管理器进行安全清理).
我相信一个例子会有所帮助.我有一个深度嵌套的dict,其中包含各种值.其中一些值是浮点值.我知道"比较"浮点值有很多陷阱等.
d1 = {'a': {'b': 1.123456}}
d2 = {'a': {'b': 1.1234578}}
Run Code Online (Sandbox Code Playgroud)
我想用它!=来比较这两个dicts,True如果唯一的区别是某个范围内的浮点数,它会返回.例如,如果值接近,则不要计算不同的值(不确定我想要的精度).
我想我可以自己递归地查看dicts并手动使用numpy.allclose()浮点值并回退到所有其他类型的正常相等测试等.但是,这有点棘手且容易出错.我认为这是一个可以接受的解决方案,我很乐意看到一个喜欢它的人.希望有更优雅的东西.
我头脑中的优雅解决方案看起来如下所示.但是,我不知道这样的事情是否可能:
with hacked_float_compare:
result = d1 != d2
Run Code Online (Sandbox Code Playgroud)
因此,在这个上下文管理器中,我将替换浮点比较(仅用于标准float()值与我自己的比较或numpy.allclose().
再说一次,我不确定这是否可行,因为猴子补丁float()因为写入而无法真正完成C.我还想避免将dicts中的每个浮点值更改为我自己的具有a的float类__eq__().也许这是最好的方法吗?
我正在尝试确保help()在Python 2.7上运行REPL显示包含__doc__的函数functools.partial.目前运行help()在一个functools.partial"功能"显示__doc__的的functools.partial类,而不是我的包裹功能的__doc__.有没有办法实现这个目标?
考虑以下callables:
def foo(a):
"""My function"""
pass
partial_foo = functools.partial(foo, 2)
Run Code Online (Sandbox Code Playgroud)
跑步help(foo)将导致显示foo.__doc__.但是,运行help(partial_foo)结果__doc__是Partial对象.
我的第一个方法是使用functools.update_wrapper其正确替换部分对象的__doc__用foo.__doc__.但是,由于pydoc的原因,这并不能解决"问题" .
我已经调查了pydoc代码,问题似乎partial_foo是实际上是一个Partial对象而不是典型的函数/可调用,有关该细节的更多信息,请参阅此问题.
默认情况下,pydoc将显示__doc__对象类型,而不是实例,如果传递的对象被inspect.isclass确定为类.有关代码本身的更多信息,请参阅render_doc函数.
所以,在上面的场景中,pydoc显示了类型的帮助,而functools.partial不是__doc__我的functools.partial实例.
反正有没有改变我的调用help()或functools.partial传递的实例,help()以便它将显示__doc__实例,而不是类型?
有没有办法对需要几个numpy数组并将它们放入字典列表的操作进行矢量化?
这是一个简化的例子.真实场景可能涉及更多数组和更多字典键.
import numpy as np
x = np.arange(10)
y = np.arange(10, 20)
z = np.arange(100, 110)
print [dict(x=x[ii], y=y[ii], z=z[ii]) for ii in xrange(10)]
Run Code Online (Sandbox Code Playgroud)
我可能在xrange通话中有数千或数十万次迭代.所有操作来创建x,y以及z被矢量(我的例子不是那么简单如上).因此,只有1个循环可以摆脱,我预计会导致巨大的加速.
我尝试使用map函数来创建字典和各种其他工作.似乎Python for循环是缓慢的部分(像往常一样).由于预先存在的API要求,我有点不习惯使用字典.但是,没有dicts和记录数组或其他东西的解决方案会很有趣,但最终我认为这不会适用于现有的API.
至少有两种方法可以在Python中反转列表,但迭代器方法要快得多(至少在Python 2.7.x中).我想了解这种速度差异的原因.
>>> x = range(1000)
>>> %timeit x[::-1]
100000 loops, best of 3: 2.99 us per loop
>>> %timeit reversed(x)
10000000 loops, best of 3: 169 ns per loop
Run Code Online (Sandbox Code Playgroud)
我怀疑速度差异至少是由于以下因素:
reversed 是用C写的reversed 是一个迭代器,所以内存开销较少我试图使用该dis模块来更好地了解这些操作,但它没有太大帮助.我不得不将这些操作放在一个函数中来反汇编它们.
>> def reverselist(_list):
... return _list[::-1]
...
>>> dis.dis(reverselist)
2 0 LOAD_FAST 0 (_list)
3 LOAD_CONST 0 (None)
6 LOAD_CONST 0 (None)
9 LOAD_CONST 1 (-1)
12 BUILD_SLICE 3
15 BINARY_SUBSCR
16 RETURN_VALUE
>>> def reversed_iter(_list):
... return reversed(_list)
...
>>> dis.dis(reversed_iter) …Run Code Online (Sandbox Code Playgroud) 我该如何将“公共”功能的项目符号列表添加到使用Sphinx记录的项目的边栏中?
例如,假设我有一个具有以下功能的模块api.py:
我想在文档的边栏中有一个指向项目1,函数2和函数3的链接的项目符号列表。这些链接将链接到使用记录的此功能页面:automodule: api。因此,每个侧边栏链接只会链接到该功能上自动记录的信息。
我尝试使用内置autosummary扩展名和fulltoc扩展名,但是我无法让他们使用我尝试的随机配置选项来做到这一点。
我认为这可能需要制作自定义sidebar.html模板。但是,如何获得Jinja模板中模块的所有功能的清单?
老实说,我不会介意硬编码一个自定义模板,在该模板中我不得不手动列出该函数和链接,但是我不知道如何href在每个项目上将其设置为直接指向自动文档化的函数信息。
我目前正在尝试在Windows中构建C扩展.这些错误似乎与在python27.dll中找不到"标准"符号有关.如何解决这些缺失的符号?我是否需要以某种方式告诉编译器在哪里找到python27.dll或者我的python27.lib有问题?
我的设置如下:
我发现这个链接似乎有一个相关的问题,但是我不使用的东西的版本:http://bugs.python.org/issue15772
我正在运行python setup.py build_ext --inplace构建扩展.
setup.py如下所示:
try:
numpy_include = numpy.get_include()
except AttributeError:
numpy_include = numpy.get_numpy_include()
fmm3d_module = Extension('_fmm3d', sources=['fmm3d.i', 'fmm3d.c'],
include_dirs = [numpy_include])
Run Code Online (Sandbox Code Playgroud)
一切编译好,然后运行以下链接命令:
C:\Program Files (x86)\Microsoft Visual Studio 9.\VC\BIN\link.exe /DLL /nologo /INCREMENTAL:NO /LIBPATH:C:\Python27\libs /LIBPATH:C:\Python27\PCbuild\ amd64 /EXPORT:init_fmm3d build\temp.win-amd64-2.7\Release\fmm3d_wrap.obj build\temp.win-amd64-2.7\Release\fmm3d.obj /OUT:C:\Users\luke\Documents\Ranking\code\_fmm3d.pyd /IMPLIB:build\temp.win-amd64-2.7\Release\_fmm3d.lib /MANIFESTFILE:build\temp.win-amd64-2.7\Release\_fmm3d.pyd.manifest
Run Code Online (Sandbox Code Playgroud)
我得到与Python符号相关的链接错误,如下所示:
fmm3d_wrap.obj : error LNK2019: unresolved external symbol __imp__PyString_AsString referenced in function _SWIG_Python_str_AsChar
fmm3d_wrap.obj : error LNK2019: unresolved external …Run Code Online (Sandbox Code Playgroud)
我正在用如下线绘制一些数据:
poly = PolyCollection(vertices, array=s, edgecolors='w', linewidths=.0001)
有没有办法完全隐藏每个单元格周围的边缘线?上面的行尝试通过将边缘颜色设置为白色和较小的线宽来实现此目的。然而,线条仍然出现。另外,将 0 传递给线宽似乎也不能做到这一点。
我也尝试过设置edgecolor为none和linewidth0 但没有成功。
有什么建议么?
我正在尝试将某些代码从Python 3.6移植到Windows 10上的Python 3.7。我看到在调用.get()该AsyncResult对象时多处理代码挂起。有问题的代码要复杂得多,但是我将其简化为类似于以下程序的代码。
import multiprocessing
def main(num_jobs):
num_processes = max(multiprocessing.cpu_count() - 1, 1)
pool = multiprocessing.Pool(num_processes)
func_args = []
results = []
try:
for num in range(num_jobs):
args = (1, 2, 3)
func_args.append(args)
results.append(pool.apply_async(print, args))
for result, args in zip(results, func_args):
print('waiting on', args)
result.get()
finally:
pool.terminate()
pool.join()
if __name__ == '__main__':
main(5)
Run Code Online (Sandbox Code Playgroud)
此代码也可以在Python 2.7中运行。出于某种原因,第一个调用get()在3.7中挂起,但是在其他版本上,一切正常。
我正在尝试使用Pyinstaller 2.1为Windows 7创建Pyinstaller构建。该模块使用相对导入,因为该软件包通常在Linux中用作“常规” Python软件包。有没有办法创建一个规范文件来处理这种类型的设置?理想情况下,我希望有一个Python包,可以与Windows一起制作Pyinstaller exe,并希望在Linux / OS X中有一个“常规”可点子安装的Python包。
我当时在考虑使用隐藏的导入或某种方法来实现此目的。
我尝试使用默认的Pyinstaller设置并将其指向我的“主要” python脚本。我从生成的exe中得到以下内容:
“尝试以非包装方式进行相对进口”
这是有道理的,因为我将Pyinstaller指向软件包中的main.py文件,而Pyinstaller并未提取整个软件包。这只是从命令行使用模块的起点。但是,您可以导入它,也可以在自己的代码中使用它。
边注:
原因是此程序包需要numpy和scipy。是的,我知道有很多方法可以通过Anaconda等在Windows中运行这些程序。但是,由于遗留原因,我现在仍坚持使用exe安装程序。