我试图mypy在一些使用LXML库解析XML的代码中进行类型检查.
在我使用的每一行上etree.XPath,我都会收到虚假错误mypy.例如,以下琐碎的脚本
from lxml import etree
NameXPath = etree.XPath("Name/text()")
Run Code Online (Sandbox Code Playgroud)
生成错误
test.py:3: error: "module" has no attribute "XPath"
Run Code Online (Sandbox Code Playgroud)
但脚本运行正常,我XPath的运行正常.
我也尝试#type:ignore过导入,我认为可能会告诉我mypy不要对该库进行类型检查,但这并没有抑制错误.
from lxml import etree # type:ignore
NameXPath = etree.XPath("Name/text()")
Run Code Online (Sandbox Code Playgroud)
通过将调用移动etree.XPath到一个没有任何类型注释的单独函数,我确实取得了一些成功,但这看起来像是一个黑客,并迫使我以尴尬的方式安排我的代码.
我想知道是否有办法完全抑制这些虚假错误,或者可能暗示etree.XPath函数确实存在,因为它似乎无法自己解决这个问题.
要清楚,我实际上并不关心mypy知道从lxml库中出来的结构的正确类型.我更关心将类型信息放在我自己的类上,我将解析后的信息推入,所以我想要使用类型检查函数etree.XPath来进行查询,查找数据,然后将它们推入类型 -在我的脚本中定义的带注释的类.
mypy似乎没有其他功能的困难etree,例如它对我的电话很好etree.parse
我目前正在使用mypy0.4.4
如何以非阻塞模式读取二进制文件或文本文件的内容?
对于二进制文件:当我open(filename, mode='rb'),我得到一个实例io.BufferedReader.文件堡垒io.BufferedReader.read 说:
读取和返回大小字节,或者如果未给出大小或为负,则直到EOF或读取调用将在非阻塞模式下阻塞.
显然,直截了当open(filename, 'rb').read()是阻塞模式.令我惊讶的是,我无法在io如何选择非阻塞模式的文档中找到任何解释.
对于文本文件:当我open(filename, mode='rt'),我得到io.TextIOWrapper.我假设相关的文档是read基类中的文档io.TextIOBase; 并根据这些文档,似乎没有办法做到无阻塞阅读所有:
从流中读取并返回最多大小字符作为单个str.如果大小为负或无,则读取直到EOF.
哪些主要操作系统/平台实现了等待变形?
当我注意到没有明确的最佳实践时,就出现了这个问题,即是否应该在互斥锁锁定的情况下向条件变量发出信号。一个典型的建议是在持有锁的同时发出信号,除非分析显示解锁带来的显着性能改进开销(通过删除额外的上下文切换)。
IIUC,在发信号时持有锁的唯一缺点是额外的两个上下文切换;优点是出现错误的风险较低,并且更容易实现实时可预测性。
因此,似乎如果实现了等待变形,那么在发信号时持有锁的做法会更好。
language-agnostic linux multithreading window condition-variable
修改标准库对象的方法返回的可变对象是否安全?
这是一个具体的例子; 但如果可能的话,我正在寻找一般答案.
#m is a MatchObject
#I know there's only one named group in the regex
#I want to retrieve the name and the value
g, v = m.groupdict().popitem()
#do something else with m
Run Code Online (Sandbox Code Playgroud)
这段代码安全吗?我担心通过改变groupdict()我会破坏对象m(我以后还需要它).
我对此进行了测试,随后对m.groupdict()的调用仍返回原始字典; 但据我所知,这可能与实现有关.
在我的代码中,对各种容器(列表,字典等)的相等性进行了大量的比较.容器的键和值的类型为float,bool,int和str.内置的==和!=工作得非常好.
我刚刚了解到必须使用自定义比较函数来比较容器值中使用的浮点数.我已经编写了这个函数(让我们称它为approxEqual(),并假设它需要两个浮点数,如果它们被判断为相等则返回True,否则返回False).
我更喜欢将现有代码的更改保持在最低限度.(新的类/函数/等可以根据需要复杂化.)
例:
if dict1 != dict2:
raise DataMismatch
Run Code Online (Sandbox Code Playgroud)
的dict1 != dict2条件需要使得在dict1和dict2的值中所使用的任何浮子正在使用approxEqual比较功能,而不是重写__eq__.
字典的实际内容来自各种来源(解析文件,计算等).
注意:我之前问了一个关于如何覆盖内置float的eq的问题.这本来是一个简单的解决方案,但我了解到Python不允许覆盖内置类型的__eq__运算符.因此这个新问题.
(使用Python 3.1)
我知道这个问题已经问过很多关于测试迭代器是否为空的一般问题了。显然,没有解决方案(我想是有原因的-迭代器直到被要求返回下一个值才真正知道它是否为空)。
但是,我有一个特定的示例,希望我可以用它编写干净的Pythonic代码:
#lst is an arbitrary iterable
#f must return the smallest non-zero element, or return None if empty
def f(lst):
flt = filter(lambda x : x is not None and x != 0, lst)
if # somehow check that flt is empty
return None
return min(flt)
Run Code Online (Sandbox Code Playgroud)
有什么更好的方法吗?
编辑:抱歉的愚蠢表示法。函数的参数确实是一个任意可迭代的,而不是列表。
(在Python 3.1中)(与我提出的另一个问题有些相关,但这个问题是关于迭代器已经用尽了.)
# trying to see the ratio of the max and min element in a container c
filtered = filter(lambda x : x is not None and x != 0, c)
ratio = max(filtered) / min(filtered)
Run Code Online (Sandbox Code Playgroud)
我花了半个小时才意识到问题是什么(过滤器返回的迭代器在到达第二个函数调用时已经耗尽).如何以最Pythonic /规范的方式重写它?
另外,除了获得更多经验之外,我还能做些什么来避免这种错误呢?(坦率地说,我不喜欢这种语言功能,因为这些类型的错误很容易制作,很难捕捉到.)
为什么collection.defaultdict而collection.OrderedDict有不同的资本化?
是否有一些我应该注意的细微差别?
(P3K)
下面的代码不起作用,我假设因为理解中的locals()变量将引用嵌套块,其中评估了理解:
def f():
a = 1
b = 2
list_ = ['a', 'b']
dict_ = {x : locals()[x] for x in list_}
Run Code Online (Sandbox Code Playgroud)
我可以使用globals(),它似乎工作,但这可能会带来一些额外的问题(例如,如果有一个来自周围范围的变量恰好具有相同的名称).
有没有什么能使字典在函数范围内精确地使用变量f?
注意:我这样做是因为我有许多变量,我希望稍后将其放入字典中,但不希望通过编写dict_['a']而不是a在此期间使代码复杂化.
[Python 3.1]
我正在尝试为容器创建一个哈希,其中可能有嵌套容器,深度未知.在层次结构的所有级别,只有内置类型.有什么好办法呢?
为什么我需要它:
我在一个pickle对象(在磁盘上)缓存一些计算的结果.如果使用不同的参数调用该函数,我将需要使该缓存的文件无效(这种情况很少发生,因此我不打算将多个文件保存到磁盘).哈希将用于比较参数.