小编max*_*max的帖子

检查容器中的NaN存在

当我检查它在列表或集合中的存在时,NaN处理得很好.但我不明白怎么做.[更新:不,不是; 如果找到相同的NaN实例,则报告存在; 如果只发现不同的NaN实例,则报告为缺席.

  1. 我认为列表中的存在是通过相等来测试的,所以我预计NaN不会被发现,因为NaN!= NaN.

  2. hash(NaN)和hash(0)都是0.字典和集合如何告诉NaN和0分开?

  3. 使用in运算符检查任意容器中NaN的存在是否安全?还是依赖于实现?

我的问题是关于Python 3.2.1; 但如果在未来的版本中存在/计划的任何更改,我也想知道.

NaN = float('nan')
print(NaN != NaN) # True
print(NaN == NaN) # False

list_ = (1, 2, NaN)
print(NaN in list_) # True; works fine but how?

set_ = {1, 2, NaN}
print(NaN in set_) # True; hash(NaN) is some fixed integer, so no surprise here
print(hash(0)) # 0
print(hash(NaN)) # 0
set_ = {1, 2, 0}
print(NaN in set_) # False; works fine, but how?
Run Code Online (Sandbox Code Playgroud)

请注意,如果我将一个用户定义的类的实例添加到a list …

python containers equality nan python-3.x

12
推荐指数
1
解决办法
2835
查看次数

为什么在迭代期间修改dict并不总是引发异常?

从迭代中删除项目通常会导致RuntimeError: dictionary changed size during iteration异常:

d = {1: 2}
# exception raised
for k in d:
  del d[k]
Run Code Online (Sandbox Code Playgroud)

更确切地说,删除本身将成功.但是,要进入下一轮迭代,解释器必须调用next(it),it通过之前获得的字典,迭代器在哪里.此时,next()会注意到字典大小发生了变化,并抱怨.

到现在为止还挺好.但是如果我们都删除并添加项目到字典呢?

d = {1: 1}
# no exception raised
for k in d:
  # order of next two lines doesn't matter
  d[k*10] = k*10
  del d[k]
Run Code Online (Sandbox Code Playgroud)

我几乎可以肯定这不安全(文档暗示在迭代期间不允许插入或删除).为什么解释器允许此代码无错运行?

我唯一的猜测是,每当调用insert或delete方法时,检查哪些迭代器无效是太昂贵了.所以dict不要尝试完善提出这个例外.相反,它只是跟踪每个迭代器内部字典的大小,并在实际要求迭代器移动到下一个项目时检查它是否未更改.有没有办法能够以低成本实现全面验证?

python dictionary python-3.x python-internals

12
推荐指数
2
解决办法
539
查看次数

SQLAlchemy:避免在声明式样式类定义中重复

我正在使用SQLAlchemy,我的对象模型中的许多类具有相同的两个属性:id和(整数和主键),以及name(字符串).我试图避免在每个类中声明它们如此:

class C1(declarative_base()):
    id = Column(Integer, primary_key = True)
    name = Column(String)
    #...

class C2(declarative_base()):
    id = Column(Integer, primary_key = True)
    name = Column(String)
    #...
Run Code Online (Sandbox Code Playgroud)

有什么好办法呢?我尝试使用元类但它还没有用.

python sqlalchemy

11
推荐指数
1
解决办法
1738
查看次数

Python:有效地在容器中找到副本

我有一个容器cont.如果我想知道它是否有重复,我会检查len(cont) == len(set(cont)).

假设我想找到一个重复的元素(如果它存在)(只是任意的重复元素).有没有任何整洁有效的方式来写这个?

[Python 3]

python algorithm duplicates python-3.x

11
推荐指数
2
解决办法
2375
查看次数

为什么操作员模块没有逻辑或功能?

在Python 3中,operator.or_等效于按位|,而不是逻辑or.为什么逻辑没有运算符or

python bitwise-operators python-3.x

11
推荐指数
2
解决办法
483
查看次数

从OrderedDict和defaultdict继承子类

Raymond Hettinger 展示了一种非常酷的方式来组合集合类:

from collections import Counter, OrderedDict
class OrderedCounter(Counter, OrderedDict):
  pass
# if pickle support is desired, see original post
Run Code Online (Sandbox Code Playgroud)

我想为OrderedDict和defaultdict做类似的事情.但是,当然,defaultdict有不同的__init__签名,因此需要额外的工作.解决这个问题最简洁的方法是什么?我使用Python 3.3.

我在这里找到了一个很好的解决方案:https://stackoverflow.com/a/4127426/336527,但我想可能从defaultdict中获得可能会使这更简单?

python collections multiple-inheritance python-3.x

11
推荐指数
1
解决办法
5383
查看次数

用户定义的泛型类型和collections.abc

我有一个Python包,它基于collections.abc(Mapping,Sequence等)提供的ABC定义了各种集合.我想利用Python 3.5中引入的类型提示功能,但我怀疑最好的方法是什么.

让我们以其中一个类为例; 到现在为止,我有类似这样的东西:

from collections.abc import Mapping

class MyMapping(Mapping):
    ...
Run Code Online (Sandbox Code Playgroud)

要将其转换为泛型类型,文档建议执行以下操作:

from typing import TypeVar, Hashable, Mapping

K = TypeVar("K", bound=Hashable)
V = TypeVar("V")

class MyMapping(Mapping[K, V]):
    ...
Run Code Online (Sandbox Code Playgroud)

但这会带来两个问题:

  • 该类丢失了collections.abc.Mapping中的所有mixin方法.我可以自己处理这个实现它们,但这首先会破坏使用ABCs的部分目的.

  • isinstance(MyMapping(), collections.abc.Mapping)返回False.此外,尝试调用collections.abc.Mapping.register(MyMapping)解决此问题会引发RuntimeError("拒绝创建继承循环").

我解决这些问题的第一个尝试是回到扩展collections.abc.Mapping:

from typing import TypeVar, Hashable
from collections.abc import Mapping

K = TypeVar("K", bound=Hashable)
V = TypeVar("V")

class MyMapping(Mapping[K, V]):
    ...
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为collections.abc.Mapping不是泛型类型,并且不支持订阅运算符.所以我尝试了这个:

from typing import TypeVar, Hashable, Mapping …
Run Code Online (Sandbox Code Playgroud)

python generics type-hinting python-3.x

11
推荐指数
1
解决办法
798
查看次数

输入模块 - 字符串文字类型

我正在使用新的Python 3.5模块输入,它很高兴.

我想知道如何根据精确的字符串文字指定类型.例如,函数保证返回四个字符串中的一个 - "North","West","East","South" - 我们如何将其表示为特定类型变量,而不仅仅是str.

我查看了文档,找到了Union类型和TypeVar功能,但无法找到答案.

表达此问题的示例函数:

def compute_quadrant(x: int, y: int) -> str:
    if x > 0 and y > 0:
        return 'I'
    elif x < 0 and y > 0:
        return 'II'
    elif x < 0 and y < 0:
        return 'III'
    elif x > 0 and y < 0:
        return 'IV'
Run Code Online (Sandbox Code Playgroud)

而不是仅仅恢复str,我想回到一个更具体的类型,它是四个值之一- ,"I","II","III""IV".

在Typescript中,人们可以做到:type Quadrant = …

python typing python-3.5

11
推荐指数
1
解决办法
980
查看次数

Scala中的call-by-name与Haskell中的懒惰评估?

Haskell的懒惰评估永远不会比急切的评估采取更多的评估步骤.

另一方面,Scala的逐个名称评估可能需要比按值调用更多的评估步骤(如果短路效益大于由重复计算的成本抵消).

我认为按名称呼叫大致相当于懒惰的评估.为什么那么时间上的这种差异保证了?

我猜测也许Haskell语言指定在评估期间必须使用memoization; 但在那种情况下,为什么Scala不这样做呢?

evaluation haskell scala lazy-evaluation

11
推荐指数
1
解决办法
955
查看次数

MappingProxyType和PEP 416 frozendict之间的区别

虽然frozendict 被拒绝了,但是types.MappingProxyType在python 3.3中向公共API添加了一个相关的类.

我理解MappingProxyType的只是底层的一个包装dict,但尽管它在功能上并不等同于frozendict

换句话说,原始PEP 416 frozendict与此之间的实质区别是什么:

from types import MappingProxyType
def frozendict(*args, **kwargs):
  return MappingProxyType(dict(*args, **kwargs))
Run Code Online (Sandbox Code Playgroud)

当然MappingProxyType不是像现在这样可以清洗,但正如PEP所建议的那样frozendict,它可以在确保其所有值都是可清除之后可以使用(MappingProxyType不能被子类化,因此需要组合和转发方法).

python immutability python-3.x

11
推荐指数
2
解决办法
2643
查看次数