小编Ale*_*agh的帖子

类名注入和构造函数

最近,在将库更新到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提交错误报告?

c++ clang language-lawyer

13
推荐指数
1
解决办法
921
查看次数

如何使用openpyxl使用宏保存XLSM文件

我有.xlsm文件与功能.我正在使用openpyxl加载它并将一些数据写入文件,最后想要另存为.xlsm文件.

要将文件保存为XLSM文件,我在Python脚本中使用了以下代码.

wb.save('testsave.xlsm');
Run Code Online (Sandbox Code Playgroud)

但如果我如上所述保存,我就无法打开该文件.但是,如果我将其保存为.xlsx,那么我可以在没有原始文件的宏功能的情况下打开文件.

我想打开一个具有宏功能的Excel工作表,编辑该文件并使用openpyxl将其另存为新的.xlsm文件.我怎样才能做到这一点?

python xlsm openpyxl

9
推荐指数
4
解决办法
3万
查看次数

使用现有C对象初始化Cython对象

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)

c++ python cython boost-python

8
推荐指数
1
解决办法
1310
查看次数

使用C++中的UTF-16编码文本截断读取

我的目标是将外部输入源转换为通用的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)

c++ encoding utf-8 utf-16 c++11

6
推荐指数
1
解决办法
899
查看次数

使用 ABCMeta 和 EnumMeta 的抽象枚举类

简单的例子

目标是通过从 和 派生的元类创建一个抽象枚举abc.ABCMetaenum.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源自 AIntEnum

>>> 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)

python metaclass python-3.x

6
推荐指数
1
解决办法
3191
查看次数

“--”是有效的 CSS3 标识符吗?

根据 CSS 级别 3规范,要解析标识符的开头,您:

检查三个代码点是否会开始一个标识符

看第一个代码点:

  • 如果第一个字符是-,那么我们有一个有效的标识符,如果:
    1. 第二个代码点是标识符起始代码点([a-zA-Z_]或非 ASCII)。
    2. 第二个代码点是-.
    3. 第二个和第三个字符构成一个有效的转义符。

否则,我们没有有效的标识符开始。在确定我们是否有一个有效的标识符开始后,唯一有效的要求<ident-token>是我们有 0 个或多个以下任意组合:

  1. 转义令牌
  2. ASCII 字母
  3. 数字
  4. _ 或者 -
  5. 非 ASCII 字符

由于我们不需要标识符开始标记后面的任何字符,这表明这--是一个有效的标识符,即使任何浏览器或框架都不支持。然而,即使是官方的 CSS 验证服务(由设计 CSS 规范的人员维护)也不认为这是一个有效的标识符。这仅仅是验证服务中的错误吗?

css w3c specifications language-lawyer

6
推荐指数
2
解决办法
82
查看次数

在 WSL2 中查找 Docker-In-Docker 绑定挂载路径

通常,当使用 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)

docker

6
推荐指数
1
解决办法
582
查看次数

如何使用 Python 将新列附加到 CSV 文件?

我在一个数组中存储了一组四个数字,我想将其添加到“分数”列下的 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 csv

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

为什么Bare-Except被淹没的原因

在一种有限的方式中,我想知道为什么在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)

我想在这种情况下,构建一个捕获操作的自定义异常是否更好,以便为阅读代码的人提供更多信息?

python python-2.7

4
推荐指数
1
解决办法
1307
查看次数