最近,在将库更新到Clang 5.x时,我注意到我的代码中的一个错误,该错误先前已在Clang 4.x,GCC 5.x-6.x和MSVC 2015和2017上编译.
#include <iostream>
#include <typeinfo>
#include <vector>
int main()
{
using a = typename std::vector<int>::vector;
std::cout << typeid(a).name() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Clang-5.x产生以下警告消息,而所有其他编译器以静默方式编译上述代码:
a.cpp:7:42: warning: ISO C++ specifies that qualified reference to 'vector' is a
constructor name rather than a type in this context, despite preceding
'typename' keyword [-Winjected-class-name]
using a = typename std::vector<int>::vector;
Run Code Online (Sandbox Code Playgroud)
哪个编译器有问题?假设Clang5.x在此处具有正确的行为,并且所有其他编译器(和版本)都不正确,我是否正确.如果是这样,是否值得向MSVC和GCC提交错误报告?
我有.xlsm文件与宏功能.我正在使用openpyxl加载它并将一些数据写入文件,最后想要另存为.xlsm文件.
要将文件保存为XLSM文件,我在Python脚本中使用了以下代码.
wb.save('testsave.xlsm');
Run Code Online (Sandbox Code Playgroud)
但如果我如上所述保存,我就无法打开该文件.但是,如果我将其保存为.xlsx,那么我可以在没有原始文件的宏功能的情况下打开文件.
我想打开一个具有宏功能的Excel工作表,编辑该文件并使用openpyxl将其另存为新的.xlsm文件.我怎样才能做到这一点?
C++模型
假设我有以下要向Python公开的C++数据结构.
#include <memory>
#include <vector>
struct mystruct
{
int a, b, c, d, e, f, g, h, i, j, k, l, m;
};
typedef std::vector<std::shared_ptr<mystruct>> mystruct_list;
Run Code Online (Sandbox Code Playgroud)
提升Python
我可以使用boost :: python使用以下代码相当有效地包装它们,轻松地允许我使用现有的mystruct(复制shared_ptr)而不是重新创建现有对象.
#include "mystruct.h"
#include <boost/python.hpp>
using namespace boost::python;
BOOST_PYTHON_MODULE(example)
{
class_<mystruct, std::shared_ptr<mystruct>>("MyStruct", init<>())
.def_readwrite("a", &mystruct::a);
// add the rest of the member variables
class_<mystruct_list>("MyStructList", init<>())
.def("at", &mystruct_list::at, return_value_policy<copy_const_reference>());
// add the rest of the member functions
}
Run Code Online (Sandbox Code Playgroud)
用Cython
在Cython中,我不知道如何从mystruct_list中提取项目,而不复制底层数据.我不知道如何MyStruct从现有的初始化shared_ptr<mystruct>,而不是以各种形式复制所有数据.
from libcpp.memory cimport shared_ptr
from cython.operator cimport …Run Code Online (Sandbox Code Playgroud) 我的目标是将外部输入源转换为通用的UTF-8内部编码,因为它与我使用的许多库(例如RE2)兼容并且是紧凑的.由于除了使用纯ASCII之外我不需要进行字符串切片,因此UTF-8对我来说是一种理想的格式.现在,我应该能够解码的外部输入格式包括UTF-16.
为了在C++中测试UTF-16(big-endian或little-endian)读取,我将测试UTF-8文件转换为UTF-16 LE和UTF-16 BE.该文件是CSV格式的简单乱码,有许多不同的源语言(英语,法语,日语,韩语,阿拉伯语,表情符号,泰语),以创建一个相当复杂的文件:
"This","?? ??","Mêmes","??"
"????"," ?????? ??????? ???????","????,",""
Run Code Online (Sandbox Code Playgroud)
UTF-8示例
现在,使用以下代码解析以UTF-8编码的此文件会产生预期的输出(我知道这个示例主要是人为的,因为我的系统编码是UTF-8,因此没有实际转换为宽字符然后返回字节是需要):
#include <sstream>
#include <locale>
#include <iostream>
#include <fstream>
#include <codecvt>
std::wstring readFile(const char* filename)
{
std::wifstream wif(filename, std::ios::binary);
wif.imbue(std::locale(wif.getloc(), new std::codecvt_utf8<wchar_t, 0x10ffff>));
std::wstringstream wss;
wss << wif.rdbuf();
return wss.str();
}
int main()
{
std::wstring read = readFile("utf-8.csv");
std::cout << read.size() << std::endl;
using convert_type = std::codecvt_utf8<wchar_t>;
std::wstring_convert<convert_type, wchar_t> converter;
std::string converted_str = converter.to_bytes( read );
std::cout << converted_str;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译并运行文件时(在Linux上,系统编码为UTF-8),我得到以下输出:
$ g++ utf8.cpp -o utf8 -std=c++14 …Run Code Online (Sandbox Code Playgroud) 目标是通过从 和 派生的元类创建一个抽象枚举abc.ABCMeta类enum.EnumMeta。例如:
import abc
import enum
class ABCEnumMeta(abc.ABCMeta, enum.EnumMeta):
pass
class A(abc.ABC):
@abc.abstractmethod
def foo(self):
pass
class B(A, enum.IntEnum, metaclass=ABCEnumMeta):
X = 1
class C(A):
pass
Run Code Online (Sandbox Code Playgroud)
现在,在 Python3.7 上,该代码将被正确解释(在 3.6.x 和可能更低的版本上,不会出现错误)。事实上,一切看起来都很棒,我们的 MRO 展示B源自 A和IntEnum。
>>> B.__mro__
(<enum 'B'>, __main__.A, abc.ABC, <enum 'IntEnum'>, int, <enum 'Enum'>, object)
Run Code Online (Sandbox Code Playgroud)
然而,即使B.foo尚未定义,我们仍然可以B毫无问题地实例化并调用foo().
>>> B.X
<B.X: 1>
>>> B(1)
<B.X: 1>
>>> B(1).foo()
Run Code Online (Sandbox Code Playgroud)
这看起来相当奇怪,因为即使我使用自定义元类,从 ABCMeta 派生的任何其他类都无法实例化。
>>> class …Run Code Online (Sandbox Code Playgroud) 根据 CSS 级别 3规范,要解析标识符的开头,您:
检查三个代码点是否会开始一个标识符
看第一个代码点:
-,那么我们有一个有效的标识符,如果:
[a-zA-Z_]或非 ASCII)。-.否则,我们没有有效的标识符开始。在确定我们是否有一个有效的标识符开始后,唯一有效的要求<ident-token>是我们有 0 个或多个以下任意组合:
_ 或者 -由于我们不需要标识符开始标记后面的任何字符,这表明这--是一个有效的标识符,即使任何浏览器或框架都不支持。然而,即使是官方的 CSS 验证服务(由设计 CSS 规范的人员维护)也不认为这是一个有效的标识符。这仅仅是验证服务中的错误吗?
通常,当使用 Docker-in-Docker 查找 Overlay2 驱动程序的绑定安装路径时,我可以通过以下方式完成:
$ docker run --rm -it --entrypoint bash \
-v /var/run/docker.sock:/var/run/docker.sock \
gcr.io/cloud-builders/docker
$ apt-get install jq -y
$ mount_point=$(docker inspect $HOSTNAME | jq -r '.[0].GraphDriver.Data.MergedDir')
$ echo "$mount_point"
/var/lib/docker/overlay2/c68a6fc53a27d6347e691a52bdd792094a7a4fdc65041b387d1ea38607ba999d/merged
$ mkdir hello && cd hello
$ echo "sample contents" > file
$ docker run --rm -it --entrypoint bash \
-v "$mount_point/hello":/hello \
-w /hello \
gcr.io/cloud-builders/docker
$ ls
# nothing
Run Code Online (Sandbox Code Playgroud)
对于除 WSL2 之外的所有内容,这将正确挂载我的文件。但是,对于 WSL2,绑定安装似乎存在于不同的位置。如果我附加的 WSL2 发行版名称是Ubuntu-22.04,我可以在下面找到唯一 IDS 的列表/mnt/wsl/docker-desktop-bind-mounts/Ubuntu-22.04/:
$ ls /mnt/wsl/docker-desktop-bind-mounts/Ubuntu-22.04/ …Run Code Online (Sandbox Code Playgroud) 我在一个数组中存储了一组四个数字,我想将其添加到“分数”列下的 CSV 文件中。
with open('Player.csv', 'ab') as csvfile:
fieldnames = ['Score']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for i in range(0, l):
writer.writerow({'Score': score[i]})
Run Code Online (Sandbox Code Playgroud)
它附加到文件中,但这会添加一个新行而不是新列。有人可以指导将其附加到新列中吗?
在一种有限的方式中,我想知道为什么在Python中使用裸露的东西是如此不受欢迎.
如果我有一个完整的程序运行,我会这样做:
import sys
from application import program
try:
program.start()
except:
print >> sys.stderr, "It didn't work"
Run Code Online (Sandbox Code Playgroud)
我正在压制重要信息并且没有真正的输出.但是让我们考虑我正在为配置设置进行IO操作,如果配置不存在或已损坏,我有一组模板要使用:
import os
from config import load_data
from template import save_data
dir = os.path.expanduser('~')
path = os.path.join(dir, 'config.txt')
try:
load_data(path)
except:
save_data(path)
Run Code Online (Sandbox Code Playgroud)
我想在这种情况下,构建一个捕获操作的自定义异常是否更好,以便为阅读代码的人提供更多信息?