小编Bri*_*cle的帖子

在Python中查找具有相同属性的列表中的两个元素

我想在列表中找到具有相同属性的任何元素对.例如,

class X:
    def __init__(self, param):
        self.param = param

my_list = [X(1), X(2), X(3), X(2), X(3), X(3)]
Run Code Online (Sandbox Code Playgroud)

因此,如果比较x.param,我会寻找my_list[1], my_list[3]my_list[2], my_list[4]my_list[2], my_list[5]my_list[4], my_list[5].但是,不能保证列表必须具有相同属性的任何元素,例如

my_list = [X(1), X(2), X(3)]
Run Code Online (Sandbox Code Playgroud)

也可能是此函数的有效参数.

显而易见的方法似乎是:

def find_dupe(my_list, my_lambda):
    attrs = dict()
    for item in my_list:
        if my_lambda(item) in attrs:
             return [attrs[my_lambda(item)], item]
        attrs[my_lambda(item)] = item
    return []
Run Code Online (Sandbox Code Playgroud)

但它似乎有点不优雅,我想知道是否有更好的方法来做到这一点.

python oop attributes dictionary list

3
推荐指数
1
解决办法
87
查看次数

使用 Rspec 监视实例方法

我有一堂有多种方法的课程,例如

class MyClass
  def method_a(p)
    method_b if p == 1
  end

  def method_b
    some_more_stuff
  end
end
Run Code Online (Sandbox Code Playgroud)

我希望使用 RSpec 来测试method_a(有时)调用method_b.

it 'calls method_b if the passed parameter is 1' do
  instance = spy('MyClass')

  instance.method_a(1)

  expect(instance).to have_received(:method_b)
end
Run Code Online (Sandbox Code Playgroud)

不幸的是,因为 RSpec 间谍不会将方法调用传递给他们正在监视的对象,所以spy.method_a实际上不会调用spy.method_b. 我尝试过使用双打和实例双打,但现在非常困惑。

如何让 RSpec double 或间谍或其他实例对象观察实例的内部方法调用而不完全替换它们?我愿意method_b以某种方式进行嘲笑,但也不知道如何正确地做到这一点。

ruby rspec

2
推荐指数
1
解决办法
5923
查看次数

标签 统计

attributes ×1

dictionary ×1

list ×1

oop ×1

python ×1

rspec ×1

ruby ×1