我有一个用Python2.7开发的Django项目,它目前使用Django版本1.10。我现在正在升级 - 首先升级到 Python3,然后我将升级 Django。
当我创建Python3虚拟环境并运行测试时:
venv bash% ./manage.py tests
Run Code Online (Sandbox Code Playgroud)
我得到了大量的回溯:
Traceback (most recent call last):
File "./manage.py", line 9, in <module>
execute_from_command_line( sys.argv )
File "/home/hove/sleipner/venv/lib/python3.5/site-packages/django/core/management/__init__.py", line 367, in execute_from_command_line
utility.execute()
File "/home/hove/sleipner/venv/lib/python3.5/site-packages/django/core/management/__init__.py", line 359, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/hove/sleipner/venv/lib/python3.5/site-packages/django/core/management/commands/test.py", line 29, in run_from_argv
super(Command, self).run_from_argv(argv)
File "/home/hove/sleipner/venv/lib/python3.5/site-packages/django/core/management/base.py", line 305, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/hove/sleipner/venv/lib/python3.5/site-packages/django/core/management/base.py", line 356, in execute
output = self.handle(*args, **options)
File "/home/hove/sleipner/venv/lib/python3.5/site-packages/django/core/management/commands/test.py", line 72, in handle
failures = test_runner.run_tests(test_labels)
File "/home/hove/sleipner/venv/lib/python3.5/site-packages/django/test/runner.py", line 549, in run_tests …Run Code Online (Sandbox Code Playgroud) 我有一个C ++类,其中的构造函数针对不同的数据类型进行了重载。一个简化的示例来说明此问题是:
#include <iostream>
#include <vector>
#include <string>
class c {
public:
c(const std::string& n, int v) :
name(n),
int_value(v)
{
std::cout << "Running <int> constructor" << std::endl;
}
c(const std::string& n, double v, const std::vector<double>& extra_args) :
name(n),
double_value(v)
args(extra_args)
{
std::cout << "Running <double> constructor" << std::endl;
}
private:
std::string name;
int int_value;
double double_value;
std::vector<double> args;
};
int main(int argc, char **argv) {
c i("name", int());
// This line should in my opinion not compile at all; …Run Code Online (Sandbox Code Playgroud) 我有一个使用旧式枚举来标记类型的现有代码库:
enum value_type {
FLOAT = 1,
DOUBLE = 2,
INT = 3
};
Run Code Online (Sandbox Code Playgroud)
然后,我想std::vector<T>基于枚举值实例化-即类似:
auto make_vector( value_type enum_value ) -> decltype(std::vector<decltype( enum_value )>) {
...
}
Run Code Online (Sandbox Code Playgroud)
当然,这decltype(enum_value)是行不通的-我想要像道德上这样的东西:
if (enum_value == FLOAT)
return decltype(double());
if (enum_value == DOUBLE)
return decltype(float());
...
Run Code Online (Sandbox Code Playgroud)
这样完全有可能-不用求助于if (enum_value == )编程风格吗?
我正在用 cmake 构建一个项目。项目使用外部库plplot;我已将 cmake 配置为库和标头,并将其缓存在 variables 中${PLPLOT_LIBRARY}, ${PLPLOT_LIB_PATH} and ${PLPLOT_INCLUDE_PATH}。在 plplot 库中,一个函数已更改名称:plwid -> plwidth我想检测它。我写了一个小try_compile()测试:
try_compile(HAVE_PLWID ${CMAKE_BINARY_DIR} cmake/tests/test_plwid.c)
Run Code Online (Sandbox Code Playgroud)
但是这个测试总是会失败,因为我必须将头和库信息传递给try_compile进程。gcc像这样手动调用:
gcc -I${PLPLOT_INCLUDE_PATH} cmake/tests/test_plwid.c -L${PLPLOT_LIB_PATH} -l${PLPLOT_LIBRARY}
Run Code Online (Sandbox Code Playgroud)
作品。但是我不明白如何将必要的标志传递给try_compile命令:我试过:
try_compile(HAVE_PLWID ${CMAKE_BINARY_DIR} cmake/tests/test_plwid.c
INCLUDE_DIRECTORIES ${PLPLOT_INCLUDE_PATH}
LINK_DIRECTORIES ${PLPLOT_LIB_PATH}
LINK_LIBRARIES ${PLPLOT_LIBRARY})
Run Code Online (Sandbox Code Playgroud)
然后我得到了 cmake 配置错误:
Attempt at a recursive or nested TRY_COMPILE in directory
/path/to/build
Run Code Online (Sandbox Code Playgroud)
我非常有信心这些${PLPLOT_XXX}变量是正确的,至少基于这些变量,构建的其余部分可以正常工作。
更新:如果我cmake使用--debug_trycompile命令调用并转到build/CMakeFiles/CMakeTmp目录并cmake手动调用:
cmake . -DINCLUDE_DIRECTORIES=/path/plplot/include -DLINK_DIRECTORIES=/path/to/plplot/lib -DLINK_LIBRARIES=plplotd
Run Code Online (Sandbox Code Playgroud)
测试程序将正确构建和链接;所以似乎挑战是将这些选项正确传递给try_compile() cmake命令调用?
我有一个像这样的C++类:
class MyClass {
int calculate( int arg1 ) const;
void side_effect( int arg) const;
}
Run Code Online (Sandbox Code Playgroud)
使用方式如下:
{
MyClass m;
m.calculate( 100 );
m.side_effect( 100 );
}
Run Code Online (Sandbox Code Playgroud)
编译器是否可以自由跳过m.calculate( )调用 - 因为我没有保留返回值?对于该side_effect( )方法,我真的希望编译器不能跳过调用 - 即使方法被标记了const?
编辑:我问这个问题的原因是我的calculate( )功能有副作用,但通过使用mutable它被标记为const.现在在正常情况下我想要保持返回值,并且整个问题没有实际意义 - 但在上面说明的情况下,我只对确定已经调用副作用感兴趣(是的 - 我知道它不是漂亮 ...).阅读答案/评论我觉得你认为编译器可以推断一种方法是否有副作用; 这让我很惊讶?