我正在尝试使用模拟引擎模拟全局变量,但它似乎不仅仅适用于我的变量。例如os.name,当我打补丁时,它工作得很好,但是对于我的自定义变量,它不起作用。这是代码:
global_var.py
var = 10
Run Code Online (Sandbox Code Playgroud)
use_global_var.py
from global_var import var
def test_call():
return var
Run Code Online (Sandbox Code Playgroud)
测试文件
import mock
from use_global_var import test_call
@mock.patch('global_var.var', 50)
def test_check():
print(test_call())
test_check()
Run Code Online (Sandbox Code Playgroud)
print 如果我理解正确,应该返回 50,但它返回 10。有谁知道这里的问题是什么以及如何解决它?
我正在使用带有 SIGEV_THREAD 参数的 timer_create 创建 linux 计时器。
有时在我解除定时器并删除它后会调用回调。这会导致段错误,因为它尝试访问已删除的资源。
http://man7.org/linux/man-pages/man2/timer_delete.2.html
Linux手册说
timer_delete() 删除在timerid 中给出ID 的定时器。如果在此呼叫时定时器已布防,则在删除之前将其撤防。被删除的定时器产生的任何未决信号的处理是未指定的。
这基本上意味着我真的不知道回调是否会被调用,我没有办法取消它,也没有办法在清理资源之前强制传递挂起的信号。
class timer_wrapper
{
private:
std::function<void()> callback_;
timer_t timer_;
static void timer_callback(sigval_t val)
{
static_cast<timer_wrapper*>(val.sival_ptr)->callback_();
}
public:
timer_wrapper(std::function<void()> callback, uint32_t interval_sec)
: callback_(std::move(callback))
{
struct sigevent ev;
ev.sigev_notify = SIGEV_THREAD;
ev.sigev_signo = 0;
ev.sigev_value.sival_ptr = this;
ev.sigev_notify_function = &timer_wrapper::timer_callback;
ev.sigev_notify_attributes = 0;
timer_create(CLOCK_REALTIME, &ev, &timer_);
struct itimerspec spec = {{0, 0}, {interval_sec, 0}};
timer_settime(timer_, 0, &spec, nullptr);
}
~timer_wrapper()
{
timer_delete(timer_);
}
};
Run Code Online (Sandbox Code Playgroud)
如果 timer_wrapper …
今天我发现这段代码并没有像我期望的那样工作。根据我的知识,对于 L 值,应该调用复制构造函数,而对于 R 值,应该选择移动构造函数。否则它的目的是什么,std::move实际上什么也不做,只是转换为 R 值。我原以为return obj会调用复制构造函数,但它调用了 move。我知道复制在这里毫无用处,但这就是规则。如果我的复制构造函数有副作用,这就是我的情况,该怎么办(我知道它不应该,但从技术上讲它可以 - 例如这里:std::cout 调用)。标准中有什么允许这种行为的吗?另外我怎样才能强制复制?
#include <iostream>
class X
{
public:
X() = default;
X(const X& r): i(r.i)
{
std::cout << "copy ctor" << std::endl;
}
X(const X&& r): i(r.i)
{
std::cout << "move ctor" << std::endl;
}
int i = 0;
};
X foo()
{
X obj;
obj.i = 10;
return obj;
}
int main()
{
X x = foo();
}
Run Code Online (Sandbox Code Playgroud)
移动演员
移动演员