小编Lou*_*ise的帖子

为什么我的Python模拟补丁以错误的顺序出现?

我有一个模块test.py,它使用键盘导入*从另一个模块keyboard.py导入函数.

在keyboard.py里面有两个功能:

def get_keys(keyList, timeStamped):
    return event.getKeys(keyList=keyList, timeStamped=timeStamped)

def wait_keys(keyList, timeStamped):
    return event.waitKeys(keyList=keyList, timeStamped=timeStamped)
Run Code Online (Sandbox Code Playgroud)

现在,我在test.py中的测试函数如下所示:

@mock.patch('keyboard.wait_keys')
@mock.patch('keyboard.get_keys')
def test_2(self, mock_waitKeys, mock_getKeys):

    mock_waitKeys.return_value = [['wait_keys!', 0.1]]
    mock_getKeys.return_value = [['get_keys!',0.1]]

    run_blocks(trials,noise,win,expInfo, incorrect, tone1, tone2, experiment_details,allPoints,32,60)            
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我正在尝试将两个模拟返回值放在适当的位置.

然而,他们的影响似乎是倒置的!

当我在交互式控制台中调用它们而在断点处停止时(或在正常调用时检查值),两个模拟函数返回彼此的假返回值!

从控制台:

get_keys()
Out[2]: [['wait_keys!', 0.1]]
wait_keys()
Out[3]: [['get_keys!', 0.1]]
Run Code Online (Sandbox Code Playgroud)

我是否误解了传递给测试函数的模拟参数的顺序?

这可能与修补keyboard.get_keys而不是test.get_keys有关吗?

谢谢!路易丝

python mocking python-mock python-unittest

15
推荐指数
1
解决办法
3366
查看次数

在Python中,如何使用交互式命令行(和可视断点?)进行调试?

我最近从Matlab转到了Python.Python是一种更好的语言(从计算机科学家的角度来看),但Python IDE似乎都缺少一个重要的东西:

一个合适的交互式调试器.

我在找:

  • 通过单击编辑器中的一行代码旁边以图形方式设置断点的功能.

  • 能够在调试器中停止时运行任何代码,包括从我的代码调用函数,显示新窗口,播放音频等.

  • 发生错误时,调试器应自动在错误行打开交互式控制台.

  • 完成交互式控制台后,您可以恢复正常执行.

Matlab具有所有这些功能,并且它们工作得非常好,但我无法在Python工具中找到它们.

我试过了:

  • PyCharm:交互式控制台很笨重,经常无法出现,并且一直崩溃(我尝试了几个不同的版本和操作系统).

  • IPython:无法设置断点 - 以编程方式启动Python控制台:您必须停止代码,插入额外的代码行,然后从头开始再次执行此操作.此外,您无法在不重新导入的情况下访问已导入的功能.

能够调试和解决问题他们第一次出现对我来说非常重要,因为我在通常需要几十分钟重新运行的程序(计算神经科学)中工作.

结论:目前没有办法在Python中完成所有这些工作.让我们希望PyLab的发展加速.

python debugging console interactive

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

如何从 RabbitMQ 获取旧消息?

我使用 Bunny (Ruby) 发布 RabbitMQ 消息,如下所示:

x.publish("Message !"+n.to_s, :routing_key => 'mychannel')
Run Code Online (Sandbox Code Playgroud)

并像这样订阅:

    ch   = conn.create_channel
x    = ch.topic('fling',durable: true)
q    = ch.queue("")
q.bind(x, :routing_key => 'mychannel')


puts "Waiting for messages."
q.subscribe( :block => true) do |delivery_info, properties, body|
puts " [x] Received #{body}, message properties are #{properties.inspect}"
Run Code Online (Sandbox Code Playgroud)

一旦我启动订阅者,它就会立即接收发送的任何消息。但是,如果我在没有启动订阅者的情况下发送消息,则当我启动订阅者时不会收到消息(无论发送者是否仍在推送消息)。

当没有订阅者在监听时,是否可以返回队列并接收过去发送的消息?

rabbitmq bunny rabbitmq-exchange

5
推荐指数
1
解决办法
7506
查看次数