Python有一个奇妙的collections模块,它有一些工具允许你dict从一组最小的方法实现一个完整的(例如).filePython中的接口有类似的东西吗?如果没有,你会推荐什么样的最小方法来实现file鸭子类型的类似对象?
你如何处理那些想要在with语句中使用你的文件像对象的东西,比如你可以使用常规文件,或者想要迭代它(就像你可以使用常规文件)或者想要能够打电话readline或readlines让它做一些智能和有用的事情(就像你可以使用普通文件)?你必须自己实现它们吗?还是有更好的选择?
我知道我可以手动实现这些中的每一个.但collections界面可以让我实现dict通过实现公正__len__,__iter__,__setitem__,和__getitem__.我得到的pop,popitem,clear,update,setdefault,__contains__,keys,items,values,get,__eq__,并且__ne__全部免费.有一个用于__dict__定义的最小接口,如果我实现它,我将获得完整的dict接口,所有额外的方法都是根据最小接口实现的.
同样,我想知道文件的最小接口是什么,我必须实现才能获得完整的接口.有没有办法让__enter__,__exit__,readline,readlines,__iter__和next如果我只是执行read,write并且close,还是我有我想要完整的每一次实施的一切我自己用手file接口?
我正在创建一个将成为DAG一部分的类.构造函数将获取指向其他实例的指针,并使用它们初始化依赖项列表.
初始化依赖列表后,只能缩短它 - 实例永远不能作为自身或其任何子项的依赖项添加.
::std::shared_ptr处理这个是很自然的.对处理DAG进行了参考计数.
不幸的是,依赖关系需要知道它们的依赖 - 当依赖关系被更新时,它需要告诉它所有的依赖.
这创造了一个可以打破的微不足道的循环::std::weak_ptr.依赖关系可以忘掉那些消失的家属.
但我无法找到一种方法让依赖::std::weak_ptr者在构建时创建一个自己.
这不起作用:
object::object(shared_ptr<object> dependency)
{
weak_ptr<object> me = shared_from_this();
dependency->add_dependent(me);
dependencies_.push_back(dependency);
}
Run Code Online (Sandbox Code Playgroud)
该代码导致在构造函数退出之前调用析构函数.
有没有一个很好的方法来处理这个问题?我对使用C++ 11的解决方案非常满意.
我正在编写一个websocket服务器,我必须处理需要取消屏蔽的屏蔽数据.
掩码是unsigned char [4],数据也是unsigned char*缓冲区.
我不希望逐字节XOR,我更喜欢一次XOR 4字节.
uint32_t * const end = reinterpret_cast<uint32_t *>(data_+length);
for(uint32_t *i = reinterpret_cast<uint32_t *>(data_); i != end; ++i) {
*i ^= mask_;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下使用reinterpret_cast有什么问题吗?
替代方案是以下代码,它不是那么明确而且不够快:
uint64_t j = 0;
uint8_t *end = data_+length;
for(uint8_t *i = data_; i != end; ++i,++j) {
*i ^= mask_[j % 4];
}
Run Code Online (Sandbox Code Playgroud)
我很喜欢替代品,包括那些依赖于c ++ 11功能的产品.
这个程序:
#include <iostream>
#include <cstdlib>
#include <string>
int main(int argc, const char *argv[])
{
using ::std::cerr;
using ::std::cout;
using ::std::endl;
if (argc < 2 || argc > 3) {
cerr << "Usage: " << argv[0] << " [<count>] <message>\n";
return 1;
}
unsigned long count = 10000;
if (argc > 2) {
char *endptr = 0;
count = ::std::strtoul(argv[1], &endptr, 10);
if ((argv[1][0] == '\0') || (*endptr != '\0')) {
cerr << "Usage: " << argv[0] << " [<count>] <message>\n"; …Run Code Online (Sandbox Code Playgroud) 我有这个Python代码来做到这一点:
from struct import pack as _pack
def packl(lnum, pad = 1):
if lnum < 0:
raise RangeError("Cannot use packl to convert a negative integer "
"to a string.")
count = 0
l = []
while lnum > 0:
l.append(lnum & 0xffffffffffffffffL)
count += 1
lnum >>= 64
if count <= 0:
return '\0' * pad
elif pad >= 8:
lens = 8 * count % pad
pad = ((lens != 0) and (pad - lens)) or 0
l.append('>' + …Run Code Online (Sandbox Code Playgroud) 我的代码基本上是这样的:
wstring japan = L"??";
wstring message = L"Welcome! Japan is ";
message += japan;
wprintf(message.c_str());
Run Code Online (Sandbox Code Playgroud)
我希望使用宽字符串,但我不知道它们是如何输出的,所以我使用了wprintf.当我运行如下的东西时:
./widestr | hexdump
Run Code Online (Sandbox Code Playgroud)
十六进制代码点创建了这个:
65 57 63 6c 6d 6f 21 65 4a 20 70 61 6e 61 69 20 20 73 3f 3f
e W c l m o ! e J p a n a i s ? ?
Run Code Online (Sandbox Code Playgroud)
为什么他们都按顺序跳了?我的意思是如果wprintf是错的,我仍然不明白为什么它会以这样一个特定的混乱顺序输出!
编辑:endianness还是什么?他们似乎旋转每两个字符.呵呵.
编辑2:我尝试使用wcout,但它输出完全相同的十六进制代码点.奇怪的!
如何在c ++中获取硬件信息(例如cpuId,biosId,diskId,baseId和videoId)?
任何人都可以给我一个示例视觉工作室项目吗?
我有以下代码:
为什么Java认为这不是有效的long.
@Test
public void testOffendingBinaryString() {
String offendingString = "1000000000000000000010101000000000000000000000000000000000000000";
assertEquals(64, offendingString.length());
Long.parseLong(offendingString, 2);
}
Run Code Online (Sandbox Code Playgroud) 我有几个不同的进程,我希望他们都登录到同一个文件.这些进程在Windows 7系统上运行.一些是python脚本,另一些是cmd批处理文件.
在Unix下,你只需让所有人以附加模式打开文件并写下来.只要每个进程PIPE_BUF在单个消息中写入少于字节,每个write调用将保证不与任何其他消息交错.
有没有办法在Windows下实现这一目标?天真的类Unix方法失败了,因为Windows不喜欢默认情况下一次打开文件的多个进程.
我想在Python 3.2程序中发送具有任意unicode主体的电子邮件.但实际上,这些消息主要由7位ASCII文本组成.所以我想使用quoted-printable在utf-8中编码的消息.到目前为止,我发现这有效,但似乎错了:
c = email.charset.Charset('utf-8')
c.body_encoding = email.charset.QP
m = email.message.Message()
m.set_payload("My message with an '\u05d0' in it.".encode('utf-8').decode('iso8859-1'), c)
Run Code Online (Sandbox Code Playgroud)
这会生成包含完全正确内容的电子邮件:
To: someone@example.com
From: someone_else@example.com
Subject: This is a subjective subject.
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: quoted-printable
My message with an '=D7=90' in it.
Run Code Online (Sandbox Code Playgroud)
特别b'\xd7\x90'.decode('utf-8')是原始Unicode字符的结果.所以quoted-printable编码正确地渲染了utf-8.我很清楚这是一个令人难以置信的丑陋黑客.但它的确有效.
这是Python 3.文本字符串应始终是unicode.我不应该将其解码为utf-8.然后从将其bytes回str用.decode('iso8859-1')是一个可怕的黑客,我不应该做,要么.
email关于编码,模块刚刚破解?我没有得到什么吗?
我试图只是简单地设置它,没有字符集.这留给我一个unicode电子邮件消息,这根本不对.我也尝试过离开encode和decode步骤.如果我将它们都关闭,它会\u05d0在尝试确定是否需要在quoted-printable编码中引用该字符时抱怨它超出范围.如果我离开这encode一步,它会痛苦地抱怨我是如何传入的bytes,它想要一个str.
c++ ×5
python ×4
c++11 ×2
windows ×2
batch-file ×1
casting ×1
email ×1
hardware-id ×1
iostream ×1
java ×1
locking ×1
logging ×1
mime ×1
optimization ×1
performance ×1
python-3.x ×1
shared-ptr ×1
string ×1
unicode ×1
widechar ×1
widestring ×1
windows-xp ×1