我一直在尝试在python中使用pytest运行单元测试.我编写了一个模块,其中包含一个类和该类中的一些方法.我为这个模块写了一个单元测试(用一个简单的断言语句来检查列表的相等性),我首先用列表实例化该类.然后我在该对象上调用一个方法(来自该类).两者test.py和要测试的脚本都在同一个文件夹中.当我运行pytest它时,我得到"收集0项".
我是新手pytest,但能够成功运行他们的示例.我在这里错过了什么?
在Windows 7上运行Python版本3.5.1和pytest版本2.8.1.
我的test.py代码:
from sort_algos import Sorts
def integer_sort_test():
myobject1 = Sorts([-100,10,-10])
assert myobject1.merge_sort() == [-101,-100,10]
Run Code Online (Sandbox Code Playgroud)
sort_algos.py是一个包含类Sorts的模块.merge_sort是Sorts下的一种方法.
在Gradle 1.10发行说明http://www.gradle.org/docs/current/release-notes中我看到了提到的C++构建.
如何设置用gradle构建的C++项目?(没有IDE)
假设我有
ProjectFolder/hello.cpp
ProjectFolder/build.gradle
Run Code Online (Sandbox Code Playgroud)
hello.cpp:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
puts("Hello World!!!");
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
build.gradle这个C++项目应该是什么基础?
更新:我已经查看了用户指南的第72章和提到的2岁的例子.它们并不简单,但更复杂.
有1个文件示例,包含6行.我没有接触C++ 10年,我只是想快速启动,例如GCC.(尚未找到)
我有一个std :: map包含一个类,该类有一个id.我有一个我试图在集合中找到的id
typedef std::set<LWItem> ItemSet;
ItemSet selectedItems;
LWItemID i = someID;
ItemSet::iterator isi;
isi = std::find_if(selectedItems.begin(), selectedItems.end(), [&a](LWItemID i)->bool { return a->GetID()==i; }
Run Code Online (Sandbox Code Playgroud)
我得到一个错误,说找不到lambda捕获变量,但我不知道我应该做什么来让它在迭代时捕获容器内容.另外,我知道我不能用循环来做这个,但我正在尝试学习lambda函数.
我对cpp很新,我正在尝试做一个项目.它说代码必须以文件名作为参数,并将由以下代码运行:
./main -i filename
Run Code Online (Sandbox Code Playgroud)
我编写了一个for循环,它将遍历参数列表以找到"-i"参数,以便我可以确定文件名.但这一行总是返回false:
argv[i] == "-i"
Run Code Online (Sandbox Code Playgroud)
以下是我的代码:
#include <string>
#include <iostream>
int main(int argc, char *argv[]) {
std::string test = argv[0];
for(int i = 0; i < argc; i++){
if(argv[i] == "-i"){
test = argv[i+1];
break;
}
}
std::cout << test;
return 1;
}
Run Code Online (Sandbox Code Playgroud) 我想编写一个接受可变数量的字符串文字的函数.如果我用C语写作,我必须写一些类似于:
void foo(const char *first, ...);
Run Code Online (Sandbox Code Playgroud)
然后调用看起来像:
foo( "hello", "world", (const char*)NULL );
Run Code Online (Sandbox Code Playgroud)
感觉它应该可以在C++中做得更好.我想出的最好的是:
template <typename... Args>
void foo(const char* first, Args... args) {
foo(first);
foo(args);
}
void foo(const char* first) { /* Do actual work */ }
Run Code Online (Sandbox Code Playgroud)
被称为:
foo("hello", "world");
Run Code Online (Sandbox Code Playgroud)
但是我担心递归本质,以及我们在得到单个参数之前不进行任何类型检查的事实,如果有人调用,会使错误混乱foo("bad", "argument", "next", 42).我想要写的,是这样的:
void foo(const char* args...) {
for (const char* arg : args) {
// Real work
}
}
Run Code Online (Sandbox Code Playgroud)
有什么建议?
编辑:还有选项void fn(std::initializer_list<const char *> args),但这使得foo({"hello", "world"});我想避免的呼叫.
我试图在我的函数中避免输出参数.旧功能是:
void getAllBlockMeanError(
const vector<int> &vec, vector<int> &fact, vector<int> &mean, vector<int> &err)
Run Code Online (Sandbox Code Playgroud)
这里vec是输入参数,fact,mean和err输出参数.我试图将输出参数分组为一个元组:
tuple< vector<int>, vector<int>, vector<int> >
getAllBlockMeanErrorTuple(const vector<int> &vec)
{
vector<int> fact, mean, err;
//....
return make_tuple(fact, mean, err);
}
Run Code Online (Sandbox Code Playgroud)
现在我可以调用新函数:
tie(fact, mean, err) = getAllBlockMeanErrorTuple(vec);
Run Code Online (Sandbox Code Playgroud)
它对我来说看起来更干净.虽然我有一个问题,如何平等分配tie(fact, mean, err)工作?它是做深拷贝还是移动?因为fact,mean和err内getAllBlockMeanErrorTuple就会被破坏,我希望它做的举动,而不是深拷贝.
按照书中的C++编程语言(Bjarne Stroustrup),在第15.2.3节(一个定义规则)第425页,我编写如下程序:
file1.cpp
struct S2 { int a; char b; };
Run Code Online (Sandbox Code Playgroud)
file2.cpp
struct S2 { int a; char bb; };
int main(){ return 0;}
Run Code Online (Sandbox Code Playgroud)
编译我试过下面的命令.
g++ -std=c++11 file1.cpp file2.cpp
Run Code Online (Sandbox Code Playgroud)
和
clang++ -std=c++11 file1.cpp file2.cpp
Run Code Online (Sandbox Code Playgroud)
这两个命令都生成可执行文件,没有任何错误或警告.但是按照书中这个例子应该给出错误.
用我的编译器
typedef const double&(*fT)(const double&, const double&);
typedef std::function<const double&(const double&, const double&)> std_func;
fT f1 = std::max<double>; //(1)
std_func f2 = static_cast<fT>(std::max<double>); //(2)
std_func f3 = f1; //(3)
Run Code Online (Sandbox Code Playgroud)
(1,2,3)工作但是
auto f4 = std::max<double>; //(4)
std_func f5 = std::max<double>; //(5)
Run Code Online (Sandbox Code Playgroud)
(4,5)不要.编译器抱怨它无法选择案例5的重载.
这种行为是否正常?
什么是最便携和正确的写作方式?
tl; dr:我收到此错误消息:
Run Code Online (Sandbox Code Playgroud)ld: -alias_list and -bitcode_bundle (Xcode setting ENABLE_BITCODE=YES) cannot be used together
我如何解决它?
我正在尝试创建自己的第三方库版本.我想确保我的所有调用都没有进入该库的系统版本,因此我使用--alias-list在所有符号上添加前缀,并生成一个头文件,该文件将所有符号重命名foo为MJB_foo.然后,--include无论何时我想使用此库,我的构建系统都会包含此头文件.
这在Android和Linux上运行良好(我非常确定它最终也适用于Windows).但是,当我尝试链接共享库时,我收到上述错误.我如何达到同样的效果?
我读过,#include <file>在编译之前,会将C++预处理器中的"文件"粘贴到我们的源文件中.
这是否意味着iostream只要我们编译源文件,"file"()也会一次又一次地编译?
在C++完成它的工作之后,中间文件的大小也会有"文件"+"源文件大小"的字节吗?