小编Omn*_*ous的帖子

为了获得完整的python文件接口,我需要实现的文件方法的最小子集是什么?

Python有一个奇妙的collections模块,它有一些工具允许你dict从一组最小的方法实现一个完整的(例如).filePython中的接口有类似的东西吗?如果没有,你会推荐什么样的最小方法来实现file鸭子类型的类似对象?

你如何处理那些想要在with语句中使用你的文件像对象的东西,比如你可以使用常规文件,或者想要迭代它(就像你可以使用常规文件)或者想要能够打电话readlinereadlines让它做一些智能和有用的事情(就像你可以使用普通文件)?你必须自己实现它们吗?还是有更好的选择?

我知道我可以手动实现这些中的每一个.但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接口?

python

9
推荐指数
1
解决办法
703
查看次数

如何在构造函数中将weak_ptrs传递给它?

我正在创建一个将成为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的解决方案非常满意.

c++ shared-ptr c++11

9
推荐指数
2
解决办法
3276
查看次数

处理低级字节操作时reinterpret_cast是否错误?

我正在编写一个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功能的产品.

c++ casting reinterpret-cast c++11

9
推荐指数
1
解决办法
861
查看次数

为什么endl被用作"\n"的同义词,即使它会导致严重的性能损失?

这个程序:

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

c++ performance iostream

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

有没有更快的方法将任意大整数转换为大端字节序列?

我有这个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)

python optimization

8
推荐指数
2
解决办法
5642
查看次数

C++:宽字符输出不正确?

我的代码基本上是这样的:

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++ string unicode widestring widechar

7
推荐指数
1
解决办法
5904
查看次数

如何使用C++在Windows中获取硬件信息?

如何在c ++中获取硬件信息(例如cpuId,biosId,diskId,baseId和videoId)?

任何人都可以给我一个示例视觉工作室项目吗?

c++ windows windows-xp hardware-id visual-studio

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

为什么Java使用这个长二进制数来使用Long.parseLong(String s,int radix)会冒犯?

我有以下代码:

为什么Java认为这不是有效的long.

@Test
public void testOffendingBinaryString() {
  String offendingString = "1000000000000000000010101000000000000000000000000000000000000000";
  assertEquals(64, offendingString.length());
  Long.parseLong(offendingString, 2);
}
Run Code Online (Sandbox Code Playgroud)

java

7
推荐指数
1
解决办法
3019
查看次数

你如何在Windows下共享日志文件?

我有几个不同的进程,我希望他们都登录到同一个文件.这些进程在Windows 7系统上运行.一些是python脚本,另一些是cmd批处理文件.

在Unix下,你只需让所有人以附加模式打开文件并写下来.只要每个进程PIPE_BUF在单个消息中写入少于字节,每个write调用将保证不与任何其他消息交错.

有没有办法在Windows下实现这一目标?天真的类Unix方法失败了,因为Windows不喜欢默认情况下一次打开文件的多个进程.

python windows logging locking batch-file

7
推荐指数
1
解决办法
3099
查看次数

如何使用Python 3.2电子邮件模块发送带有quoted-printable的utf-8编码的unicode消息?

我想在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.然后从将其bytesstr.decode('iso8859-1')是一个可怕的黑客,我不应该做,要么.

email关于编码,模块刚刚破解?我没有得到什么吗?

我试图只是简单地设置它,没有字符集.这留给我一个unicode电子邮件消息,这根本不对.我也尝试过离开encodedecode步骤.如果我将它们都关闭,它会\u05d0在尝试确定是否需要在quoted-printable编码中引用该字符时抱怨它超出范围.如果我离开这encode一步,它会痛苦地抱怨我是如何传入的bytes,它想要一个str.

python email mime character-encoding python-3.x

7
推荐指数
1
解决办法
2536
查看次数