我正在使用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.
是什么造成的?
引用cppreference:
std :: random_device是一个非确定性随机数引擎,但如果不支持非确定性随机数生成,则允许实现使用伪随机数引擎实现std :: random_device.
有没有办法检查当前实现是否使用PRNG而不是RNG(然后说出错并退出),如果没有,为什么不呢?
请注意,一点点谷歌搜索显示至少MinGW std::random_device以这种方式实现,因此如果std::random_device要使用它是真正的危险.
---编辑---
而且,如果答案是否定的,有人可以给一些见解,为什么没有这样的功能/特征/ 东西,我会很感兴趣.
这是安全还是这恰好适用于我当前的编译器?标准中有什么关于这个的吗?浮点向量中的结果是正确的.
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) 可以说我有
struct foo {
void ham() {}
void ham() const {}
};
struct bar {
void ham() {}
};
Run Code Online (Sandbox Code Playgroud)
假设我有一个模板化函数,我可以判断给定类型是否具有const重载ham?
我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,整个数组被视为反转,因此,指向数组前面的指针实际上是指针过去结束?
我有两个不同的相同功能的实现
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?