小编max*_*max的帖子

从__eq__返回NotImplemented

NotImplemented__eq__python 3中的特殊方法返回的结果是什么(如果重要,则为3.5)?

文件不清楚; 我发现唯一相关文字只是模糊地提到"其他一些后备":

NotImplemented返回时,解释器将尝试在其他类型的,或其他一些后备的反射操作,取决于运营商.如果所有尝试的操作都返回NotImplemented,则解释器将引发适当的异常.有关更多详细信息,请参阅实现算术运算.

不幸的是,"更多细节"链接根本没有提到__eq__.

我对这段摘录的解读表明,下面的代码应该引发"适当的例外",但它不会:

class A:
  def __eq__(self, other):
    return NotImplemented

class B:
  def __eq__(self, other):
    return NotImplemented

# docs seems to say these lines should raise "an appropriate exception"
# but no exception is raised
a = A()
b = B()
a == b # evaluates as unequal
a == a # evaluates as equal
Run Code Online (Sandbox Code Playgroud)

从实验开始,我认为当NotImplemented返回时__eq__,解释器的行为就好像__eq__首先没有定义一样(具体来说,它首先交换参数,如果这不能解决问题,它会使用 …

python equality python-3.x python-internals

7
推荐指数
2
解决办法
1045
查看次数

具有功能范围和没有拆卸代码的夹具有什么好处?

没有拆卸代码的(默认)功能范围夹具有什么优势?为什么不在测试开始时调用函数?

例如,写作的好处是什么:

@pytest.fixture
def smtp():
    return smtplib.SMTP("smtp.gmail.com")

def test_ehlo(smtp):
    response, msg = smtp.ehlo()
    # ...
Run Code Online (Sandbox Code Playgroud)

而不是简单地:

def create_smtp():
    return smtplib.SMTP("smtp.gmail.com")

def test_ehlo():
    smtp = create_smtp()
    response, msg = smtp.ehlo()
    # ...
Run Code Online (Sandbox Code Playgroud)

我理解为什么在我们需要拆卸代码时固定装置很有用.我也理解为什么具有除函数之外的范围的灯具是有用的:我们可能希望在多个测试中重复使用相同的"外部"对象(以节省创建它所需的时间;或者甚至可能保持其状态 - 尽管看起来似乎相当危险,因为这会在单独的测试之间产生难以看见的耦合).

python pytest

7
推荐指数
1
解决办法
658
查看次数

原始/引用类型是存储在堆上还是堆栈上?

什么决定了JS中的存储类型?它与原始类型与引用类型有什么关系吗?

我来自 C++/python 背景。阅读这个问题的答案和评论,我遇到了一些相互不兼容(甚至内部不一致)的陈述:

接受的答案

  • Primitive values是存储在堆栈上的数据。
  • Primitive value 直接存储在变量访问的位置。
  • Reference values是存储在堆中的对象
  • Reference value 存储在变量 location 中的是指向存储对象的内存位置的指针。

评论来看:

值是存储在堆栈上还是堆上并不由它们在 JS 中的类型决定。它取决于存储它的变量的生命周期(受范围,尤其是闭包的影响,并取决于引擎的分析能力)。

来自投票最高的答案:

JavaScript 没有堆栈或堆。它是一种动态语言,JavaScript 中的所有变量都是动态的。[...] JavaScript 中的所有值(原语和对象)都是从堆中分配的。甚至变量本身也是从堆中分配的。

有人可以澄清或向我推荐技术上正确的解释吗?如果该方法依赖于实现,我会很感激参考实现中的差异。

javascript

7
推荐指数
1
解决办法
1072
查看次数

在Python中打印到文件:redirect vs print的文件参数vs write

我有一堆print调用,我需要写入文件而不是stdout.(我根本不需要stdout.)

我正在考虑三种方法.它们中的任何一个都有任何优势(包括性能)吗?

完全重定向,我在这里看到:

import sys

saveout = sys.stdout
fsock = open('out.log', 'w')
sys.stdout = fsock

print(x)
# and many more print calls

# later if I ever need it:
# sys.stdout = saveout
# fsock.close()
Run Code Online (Sandbox Code Playgroud)

每个打印声明中的重定向:

fsock = open('out.log', 'w')
print(x, file = fsock)
# and many more print calls
Run Code Online (Sandbox Code Playgroud)

写功能:

fsock = open('out.log', 'w')
fsock.write(str(x))
# and many more write calls
Run Code Online (Sandbox Code Playgroud)

python redirect stdout file python-3.x

6
推荐指数
1
解决办法
9513
查看次数

如何在Python中实现数据库样式表

我正在实现一个类似于典型数据库表的类:

  • 已命名列和未命名的行
  • 有一个主键,我可以通过它来引用行
  • 支持按主键和列标题检索和分配
  • 可以要求为任何列添加唯一或非唯一索引,从而允许快速检索在该列中具有给定值的行(或行集)
  • 删除行很快并实现为"软删除":行是物理保留的,但标记为删除,并且不会显示在任何后续检索操作中
  • 添加一个列很快
  • 很少添加行
  • 很少删除列

我决定直接实现该类,而不是使用sqlite的包装器.

什么是一个好的数据结构使用?


举个例子,我想到的一种方法是字典.它的键是表的主键列中的值; 它的值是以下列方式之一实现的行:

  1. 作为清单.列号被映射到列标题中(使用一个方向的列表和另一个方向的映射).这里,检索操作首先将列标题转换为列号,然后在列表中找到相应的元素.

  2. 作为词典.列标题是此字典的键.

不确定两者的优点/缺点.


我想编写自己的代码的原因是:

  • 我需要跟踪行删除.也就是说,在任何时候我都希望能够报告哪些行被删除以及哪些"原因"("原因"被传递给我的删除方法).
  • 我需要在索引期间进行一些报告(例如,在构建非唯一索引时,我想检查某些条件并报告它们是否被违反)

python performance implementation data-structures

6
推荐指数
1
解决办法
1024
查看次数

Python函数参数:tuple/list

我的函数需要一个列表或一个元组作为参数.它并不关心它是什么,它只是将它传递给另一个接受列表或元组的函数:

def func(arg): # arg is tuple or list
  another_func(x)
  # do other stuff here
Run Code Online (Sandbox Code Playgroud)

现在我需要稍微修改一下这个函数来处理一个额外的元素:

def func(arg): #arg is tuple or list
  another_func(x + ['a'])
  # etc
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不会起作用:如果arg是元组,我必须说x + ('a',).

显然,我可以通过强制arg列出来使其工作.但它并不整洁.

有没有更好的方法呢?当然,我不能强迫呼叫者总是传递一个元组,因为它只是转移到他们的工作.

python coding-style tuples list

6
推荐指数
1
解决办法
6726
查看次数

Python:可变长度的元组

[Python 3.1]

我正在跟进元组应该具有已知长度的设计概念(请参阅此注释),并且在大多数情况下应将未知长度元组替换为列表.我的问题是在什么情况下我应该偏离该规则?

例如,我知道元组字符串和数字文字比列表更快(参见另一条评论).那么,如果我有性能关键的代码,其中存在大量的计算,如果性能受到影响,我是否sumproduct(tuple1, tuple2)应重新定义它们以在列表上工作?(sumproduct((x, y, z), (a, b, c))定义为x * a + y * b + z * c,其参数未指定但长度相等).

那么使用Python时自动构建的元组怎么样def f(*x)?我认为每次使用它都不应强制列出.

顺便说一下,(x, y, z)创建比[x, y, z](对于变量而不是文字)更快?

python performance tuples list python-3.x

6
推荐指数
1
解决办法
6208
查看次数

numpy.ndarray:转换为"普通"类

[Python 3]

我喜欢,ndarray但我觉得使用起来很烦人.

这是我面临的一个问题.我想写class Array一下,它将继承ndarray的大部分功能,但只有一种方法可以实例化:作为一个特定大小的零填充数组.我希望写:

class Array(numpy.ndarray):
  def __init__(size):
    # What do here?
Run Code Online (Sandbox Code Playgroud)

我想调用super().__init__一些参数来创建一个零填充数组,但由于ndarray使用全局函数numpy.zeros(而不是构造函数)来创建一个零填充数组,因此它不起作用.

问题:

  1. 为什么ndarray在很多情况下使用全局(模块)函数而不是构造函数?如果我试图在面向对象的环境中重用它们,那将是一个很大的烦恼.

  2. 定义class Array我需要的最佳方法是什么?我应该只手动填充ndarray零,还是有任何方法可以重用该zeros功能?

python numpy wrapper python-3.x

6
推荐指数
2
解决办法
1720
查看次数

问题子类化内置类型

# Python 3
class Point(tuple):
    def __init__(self, x, y):
        super().__init__((x, y))

Point(2, 3)
Run Code Online (Sandbox Code Playgroud)

会导致

TypeError:tuple()最多需要1个参数(给定2个)

为什么?我该怎么做呢?

python built-in-types subclassing python-3.x

6
推荐指数
1
解决办法
1221
查看次数

在调试器中更改Python代码

是否有任何调试器允许在调试时更改Python代码?

换句话说:发生运行时异常,调试器停止,我以任何我喜欢的方式更改代码,并告诉程序继续.

我知道这种方法存在的问题,如果我动态地重新定义函数,那么对函数的引用仍将指向旧的定义,依此类推.我很好,因为我只想在非常简单的情况下进行小修复.

另一方面,我也感兴趣的是理论上是否可以允许更改Python代码而不会遇到这些问题:即,以某种方式更新所有对更改的对象的引用,等等.我几乎可以肯定答案第二个问题是否定的,但如果我错了,我想知道.

编辑:如果我的目标(在发生异常时以交互方式更改代码,然后继续执行),可以在没有调试器的情况下实现 - 这也是好的.我不需要使用调试器.

python debugging python-3.x

6
推荐指数
1
解决办法
1236
查看次数