这主要是出于好奇心的问题.我注意到numpy测试套件包含128位整数的测试,numerictypes模块引用int128,float256(八倍精度?),以及其他类型似乎没有映射到我的机器上的numpy dtypes.
我的机器是64位,但我可以使用四倍的128位浮点数(但不是真的).我想如果可以在软件中模拟四重浮点数,理论上也可以模拟八重浮点数和128位整数.另一方面,直到现在我才从未听说过128位整数或八位精度浮点数.numerictypes如果没有相应的dtypes,为什么在numpy的模块中有128位int和256bit浮点的引用?如何使用它们?
我在Matlab中有一个大型(多GB)数组,我想截断¹.天真地,我认为截断不需要太多内存,但后来我意识到它可能会:
>> Z = zeros(628000000, 1, 'single');
>> Z(364000000:end) = [];
Out of memory. Type HELP MEMORY for your options.
Run Code Online (Sandbox Code Playgroud)
除非Matlab在截断之前做了一些聪明的优化,否则Z这段代码实际上会创建一个数组(类型为double!)364000000:628000000.我不需要这个数组,所以我可以这样做:
>> Z = Z(1:363999999);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,第二个例子有效,并且对我来说没问题.但为什么它有效呢?如果Z(364000000:end) = 0由于没有所需的中间阵列的存储器364000000:628000000,那么,为什么不Z = Z(1:363999999)因未能所需中间阵列的存储器1:363999999,这是较大的?当然,我不需要这个中间数组,并且对于在没有任何中间数组的情况下截断我的数组的解决方案感到满意,或者,如果Matlab优化了特定方法,则会失败.
¹原因:我正在处理数据,但不知道预分配多少.我做了一个有根据的猜测,经常我分配太多.我根据可用内存选择块大小,因为拆分更少的块意味着更快的代码.所以我想避免任何不必要的内存使用.另见关于按块分配的这篇文章.
在Python中,使用空参数列表定义函数需要一组空括号.但是,class使用默认超类定义a 不需要一组空括号; 相反,这些是可选的,似乎并不常见.为什么会这样?
另请参见:Python类定义语法.
在Python中,存在单个前导下划线,双前导下划线,双前导+双尾下划线和单尾随下划线的约定.其中许多内容在对象名称之前的单个和双下划线的含义中是什么?.
但单一领先+单尾跟下划线的意义或惯例是什么?我第一次看到他们在enum模块中的使用:
8.13.15.3.2.支持的
_sunder_名称
_name_- 会员姓名_value_- 会员价值; 可以在新的设置/修改_missing_- 未找到值时使用的查找函数; 可能会被覆盖_ignore_- 作为list()或str()的名称列表,不会转换为成员,并将从最终类中删除_order_- 在Python 2/3代码中使用以确保成员顺序一致(类属性,在类创建期间删除)_generate_next_value_- 由Functional API和auto用于获取枚举成员的适当值; 可能会被覆盖
我还没有见过这样的单龙头单结尾下划线破甲之前的名字.它们是以任何特殊方式处理,还是具有与任何其他与下划线相关的命名约定不同的隐含含义?它们与没有下划线有何不同?
在Python 3.2(和其他版本)中,os.open的文档说明:
此功能适用于低级I/O. 对于正常使用,使用内置函数open(),它返回一个带有read()和write()方法的文件对象(以及更多).要将文件描述符包装在文件对象中,请使用fdopen().
而对于fdopen() :
返回连接到文件描述符fd的打开文件对象.这是open()的别名并接受相同的参数.唯一的区别是fdopen()的第一个参数必须始终是一个整数.
这个评论对之间的差异问题io.open和os.open(此不同的是完全清楚对我来说,我一直使用io.open,从来没有os.open)问:为什么会有人选择Python低级别的I/O?,但没有真正得到答案.
我的问题是非常相似的带注释的问题:在Python中,什么是I/O通过低级别的使用情况下os.open,os.fdopen,os.close,os.read,等?我曾经认为需要对一个过程进行deamonise,但我不再那么肯定了.是否有任何任务只能使用低级I/O执行,而不能使用更高级别的包装器执行?
我刚刚发现 - 偶然 - 数组numpy可能被空元组索引:
In [62]: a = arange(5)
In [63]: a[()]
Out[63]: array([0, 1, 2, 3, 4])
Run Code Online (Sandbox Code Playgroud)
我在numpy wiki ZeroRankArray上找到了一些文档:
(Sasha)首先,无论对x [...]和x [()]做出什么选择,它们都应该是相同的,因为......对于"尽可能多的:必要的"只是语法糖,在零的情况下rank导致... =(:,)*0 =().其次,排名为零的数组和numpy标量类型在numpy内是可互换的,但numpy标量可以用在某些python结构中,其中ndarrays不能.
因此,对于0-d阵列a[()]和a[...]应该是等效的.它们也适用于高维阵列吗?他们强烈地看起来像是:
In [65]: a = arange(25).reshape(5, 5)
In [66]: a[()] is a[...]
Out[66]: False
In [67]: (a[()] == a[...]).all()
Out[67]: True
In [68]: a = arange(3**7).reshape((3,)*7)
In [69]: (a[()] == a[...]).all()
Out[69]: True
Run Code Online (Sandbox Code Playgroud)
但是,它不是语法糖.不适用于高维数组,甚至不适用于0维数组:
In [76]: a[()] is a
Out[76]: False
In …Run Code Online (Sandbox Code Playgroud) 我做了一个git bisect并得到了结果
Bisecting: a merge base must be tested
[bbdaf1111eea5365c0c94d6045d6263aab718925] Fix display bug with main-stage
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
我一直在阅读Python 3.7的数据类作为namedtuples的替代品(我在组织中对数据进行分组时通常使用的).我想知道dataclass是否与属性装饰器兼容,以定义数据类的数据元素的getter和setter函数.如果是这样,这是在某处描述的吗?或者有可用的例子吗?
我正在尝试使用 pytest 来测试我的函数是否记录了预期的文本,例如解决了这个问题(pyunit 等效项是assertLogs)。按照pytest logging documentation,我将caplog夹具传递给测试人员。该文件指出:
最后,在测试运行期间发送到记录器的所有日志都以 logging.LogRecord 实例和最终日志文本的形式在夹具上可用。
我正在测试的模块是:
import logging
logger = logging.getLogger(__name__)
def foo():
logger.info("Quinoa")
Run Code Online (Sandbox Code Playgroud)
测试人员是:
def test_foo(caplog):
from mwe16 import foo
foo()
assert "Quinoa" in caplog.text
Run Code Online (Sandbox Code Playgroud)
我希望这个测试能够通过。但是,运行测试 withpytest test_mwe16.py显示由于为caplog.text空而导致测试失败:
============================= test session starts ==============================
platform linux -- Python 3.7.3, pytest-5.3.0, py-1.8.0, pluggy-0.13.0
rootdir: /tmp
plugins: mock-1.12.1, cov-2.8.1
collected 1 item
test_mwe16.py F [100%]
=================================== FAILURES ===================================
___________________________________ test_foo ___________________________________
caplog = <_pytest.logging.LogCaptureFixture object at …Run Code Online (Sandbox Code Playgroud) class Foo(object):
pass
foo = Foo()
def bar(self):
print 'bar'
Foo.bar = bar
foo.bar() #bar
Run Code Online (Sandbox Code Playgroud)
来自JavaScript,如果"类"原型增加了某个属性.众所周知,该"类"的所有实例在其原型链中都具有该属性,因此不必对其任何实例或"子类"进行修改.
从这个意义上说,像Python这样的基于类的语言如何实现Monkey补丁?