小编Xar*_*arn的帖子

如何为Mypy类型注释指定OrderedDict K,V类型?

我正在使用Python 3.5和Mypy对我的脚本进行一些基本的静态检查.最近我重构了一些返回OrderedDict的方法,但是当我尝试使用指定了Key和Value类型的返回注释时,遇到了''type'对象不可订阅"错误.

减少的例子:

#!/usr/bin/env python3.5

from collections import OrderedDict

# this works
def foo() -> OrderedDict:
    result = OrderedDict() # type: OrderedDict[str, int]
    result['foo'] = 123
    return result

# this doesn't
def foo2() -> OrderedDict[str, int]:
    result = OrderedDict() # type: OrderedDict[str, int]
    result['foo'] = 123
    return result

print(foo())
Run Code Online (Sandbox Code Playgroud)

这是运行时的python输出:

Traceback (most recent call last):
  File "./foo.py", line 12, in <module>
    def foo2() -> OrderedDict[str, int]:
TypeError: 'type' object is not subscriptable
Run Code Online (Sandbox Code Playgroud)

然而,Mypy对注释中的类型注释没有任何问题,实际上如果我尝试这样做就会发出警告result[123] = 123.

是什么造成的?

python python-3.5 mypy

20
推荐指数
3
解决办法
4558
查看次数

有没有办法检查std :: random_device是否实际上是随机的?

引用cppreference:

std :: random_device是一个非确定性随机数引擎,但如果不支持非确定性随机数生成,则允许实现使用伪随机数引擎实现std :: random_device.

有没有办法检查当前实现是否使用PRNG而不是RNG(然后说出错并退出),如果没有,为什么不呢?

请注意,一点点谷歌搜索显示至少MinGW std::random_device以这种方式实现,因此如果std::random_device要使用它是真正的危险.

---编辑---
而且,如果答案是否定的,有人可以给一些见解,为什么没有这样的功能/特征/ 东西,我会很感兴趣.

c++ random c++11

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

来自std :: vector对象的memcpy底层数据

这是安全还是这恰好适用于我当前的编译器?标准中有什么关于这个的吗?浮点向量中的结果是正确的.

class Color {
public:
  Color(float r, float g, float b, float a) : mColor{r,g,b,a} {};

  inline const float *data() const
  {
    return mColor;
  }

private:
  enum {vectorSize = 4};
  float mColor[vectorSize];
};

//test
std::vector<Color> colors(2);
std::vector<float> floats(8);
colors[0] = Color(0.1, 0.2, 0.3, 0.4);
colors[1] = Color(0.5, 0.6, 0.7, 0.8);
memcpy(floats.data(), colors.data(), 8 * sizeof(float));
Run Code Online (Sandbox Code Playgroud)

c++ compiler-construction memcpy

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

如何检查成员函数是否具有const重载?

可以说我有

struct foo {
    void ham() {}
    void ham() const {}
};

struct bar {
    void ham() {}
};
Run Code Online (Sandbox Code Playgroud)

假设我有一个模板化函数,我可以判断给定类型是否具有const重载ham

c++ templates c++11

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

为什么使用`std :: reverse_iterator`不会调用UB?

std::reverse_iterator今天正在与之合作,并且正在考虑如何使用通过调用begin容器创建的值.根据cppreference,如果我reverse_iterator r构造了iterator i,以下必须持有&*r == &*(i-1).

但是,这意味着如果我写这个

std::vector<int> vec = {1, 2, 3, 4, 5};
auto iter = std::make_reverse_iterator(begin(vec));
Run Code Online (Sandbox Code Playgroud)

iter现在指向之前放置的内存begin(vec),这是一个超出界限的内存.通过严格解释C++标准,这将调用UB.

(指针/迭代器有一个特定的规定,指向数组的1-last-the-end-end,但据我所知,没有指针/迭代器到数组1的数字开头.)

所以,我读错了链接,或者在这个案例的标准中是否有特定的规定,或者是在使用时reverse_iterator,整个数组被视为反转,因此,指向数组前面的指针实际上是指针过去结束?

c++ iterator stl

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

在c ++中搜索unordered_map的时间

我有两个不同的相同功能的实现

IPAddress UMNS::lookup(const HostName& name) const{
    auto it=ns.find(name);
    if(it!=ns.end()){
        return (*it).second;
    }
    return NON_EXISTING_ADDRESS;

}
Run Code Online (Sandbox Code Playgroud)

IPAddress UMNS::lookup(const HostName& name) const{

    auto it=find_if(ns.begin(),ns.end(),
        [&name] ( const pair<HostName,IPAddress> &a){ return a.first==name;});
    bool found = it != ns.end();
    if ( found ){
        return (*it).second;
    }
    return NON_EXISTING_ADDRESS;

}
Run Code Online (Sandbox Code Playgroud)

ns是一个unordered_map但两个函数的执行时间不一样.

第一个实现给出了这样的:
搜索次数:1000000
平均搜索时间(ms):0.000373

第二个实现给出了这个:
搜索次数:1000000
平均搜索时间(ms):24.9

第二次实施有什么问题?
为什么我不能使用find_if?

c++ stl

0
推荐指数
1
解决办法
164
查看次数