几个月前我刚刚开始学习Python,我试图理解不同__get*__方法之间的差异:
__get__
__getattr__
__getattribute__
__getitem___
Run Code Online (Sandbox Code Playgroud)
他们的__del*__等价物:
__del__
__delattr__
__delete__
__delitem__
Run Code Online (Sandbox Code Playgroud)
这些有什么区别?我什么时候应该使用另一个?是否有一个特定的原因,为什么大多数__get*__方法都有__set*__等价物,但没有__setattribute__?
我std::map::insert的语义让我有些困惑.我的意思是,我不是在抱怨 - 标准是标准,API就是这样.仍然,
insert 将
插入操作检查插入的每个元素是否已经在具有相同键值的容器中存在另一个元素,如果是,则不插入该元素,并且不以任何方式更改其映射值.
而且 - 只有在它的单参数版本中pair<iterator,bool> insert ( const value_type& x );它甚至会告诉你它是否甚至将(新的,可能不同的)值插入到键中.据我所知,如果密钥已经存在,迭代器版本将默默地忽略插入.
对我来说,这只是反直觉,我原本期望值部分被覆盖,旧值部分在插入时被丢弃.显然,STL的设计者有不同的想法 - 任何人都知道(历史)的基本原理,或者能够彻底解释现有语义如何(更有意义)?
举例:
在单键映射中实现插入有几种基本方法,例如std::map:
我现在试图理解为什么insert_or_ignore比insert_or_replace(或insert_or_error)更有意义!
我查看了我的TC++ PL副本(不幸的是我只有德语版),有趣的是,Stroustrup在第17.4.1.7章(地图列表操作)中写道:(抱歉粗略翻译德语)
(...)通常情况下,在调用
insert()(...)之前,人们不关心是否新插入了密钥(sic!)或已经存在密钥(sic!)
在我看来,它只适用于集合,而不适用于地图,因为对于地图,如果插入了提供的值或旧的遗留在地图中,它确实会产生很大的差异.(这显然与密钥无关,因为密钥是等效的.)
注意:我知道operator[]并且我知道有效STL的第24项和那里提出的efficientAddOrUpdate功能.我只是对insert语义的理由感到好奇,因为我个人觉得它们反直觉.
在N4296草案中快速搜索之后,我在C++标准库中找不到任何名称的示例,其中存在两种可能的拼写(BrE与AmE).
虽然这可能是有意的,但我可以想象,在某些时候,如果一个图形库将被标准化(并且似乎在这个方向上有一些努力),"颜色"和"颜色"之间的选择必须是制作.
是否有规范性法规或甚至非正式标准用于决定在C++标准库中选择哪些拼写名称?
我有构建的C++/C混合代码
a)Win-7 x32上的Visual C++ 2010 Express(免费版).
b)安装在Windows-7 Home高级版x32上的Cygwin/Gcc环境.gcc版本3.4.4(cygming special,gdc 0.12,使用dmd 0.125)
c)Ubuntu 10.04 Linux-GCC版本4.4.3(Ubuntu 4.4.3-4ubuntu5)
我有一个代码如下(它是我的用户定义的类的成员函数),它计算传递的对象的绝对值myhalf-
myhalf::myhalfabs(myhalf a)
{
float tmp;
tmp = abs(a.value); //This abs is from math.h :- float abs(float)
return tmp;
}
Run Code Online (Sandbox Code Playgroud)
这在MS-Visual C++ 2010中完全按照需要工作.-ve nos的abs()被正确地返回为+ ve nos具有相同的值.奇怪的是,当我在b)Cygwin/gcc环境&c)上面提到的Linux-gcc 4.4.3上构建这个代码时,我得到了垃圾输出.所以激发了gdb,经过大量的汗水和代码上的"二元搜索方法"来决定它出错的地方,我点击了上面这段代码:
tmp = abs(a.value);
Run Code Online (Sandbox Code Playgroud)
这在cygwin/gcc下表现得很奇怪.
对于-ve数字,abs()返回0(零).WTF?
然后作为解决方法,避免从stdlib调用abs(),并编码我自己的abs,如下所示:
myhalf::myhalfabs(myhalf a)
{
float tmp;
unsigned int tmp_dbg;
// tmp = abs(a.value);
tmp_dbg = *(unsigned int*)(&a.value);
tmp_dbg = tmp_dbg & 0x7FFFFFFF;
tmp = *(float*)(&tmp_dbg);
return tmp;
}
Run Code Online (Sandbox Code Playgroud)
这在cygwin/gcc和linux-gcc上运行良好,并且输出符合要求,当然它在MS-Visual C++ 2010上运行良好.
这是我使用的cygwin/gcc和linux-gcc构建的整个Makefile.如果有人在那里看到可疑的东西: - …
在Python中,我想获取当前的Unix时间戳,然后长期存储该值并由非Python系统处理。(我不仅仅是试图计算同一程序运行中两个时间戳之间的差异。)
调用该函数time.time()似乎是获取所需时间戳的一种非常合理且简洁的方法......直到我阅读文档:
以浮点数形式返回自纪元以来的时间(以秒为单位) 。纪元的具体日期和闰秒的处理取决于平台。在 Windows 和大多数 Unix 系统上,纪元是 1970 年 1 月 1 日 00:00:00 (UTC),闰秒不计入自该纪元以来的时间(以秒为单位)。这通常称为 Unix 时间。要了解给定平台上的纪元,请查看。
gmtime(0)[...]
“纪元……取决于平台”这句话是一个警告信号。狡猾的说法是“大多数Unix 系统”。time.time()Python的纪元不是1970-01-01T00:00:00Z的 Unix 或非 Unix 系统的示例有哪些?
time.time()对我的目标来说是不是有点不安全?我应该寻找替代品datetime.datetime.now().timestamp()吗?
深入挖掘后,我还注意到以前版本的 Python 似乎没有以下警告time.time():
以浮点数形式返回自纪元以来的时间(以秒为单位)。请注意,尽管时间始终以浮点数形式返回,但并非所有系统都提供比 1 秒更好的时间精度。虽然此函数通常返回不递减的值,但如果系统时钟在两次调用之间被调回,则它可能返回比前一次调用更低的值。
甚至更旧的措辞:
以浮点数形式返回时间,以 UTC 格式自纪元以来的秒数表示。请注意,尽管时间始终以浮点数形式返回,但并非所有系统都提供比 1 秒更好的时间精度。虽然此函数通常返回不递减的值,但如果系统时钟在两次调用之间被调回,则它可能返回比前一次调用更低的值。
C++的容器vector,deque... at(index)除了operator[index]访问容器元素外,还提供访问器功能.
这个成员函数和成员运算符函数operator []之间的区别在于deque :: at信号,如果请求的位置超出范围,则抛出out_of_range异常.
我从来没有在代码中需要这个函数,因为在我的C++代码中访问可能超出范围的元素是没有意义的.始终编写代码以访问正确的索引(或者在索引无法匹配的情况下产生有意义的错误/异常.)
我会对真实世界的例子(可能来自一些开源项目,因为它会添加一些上下文)感兴趣,at()在生产代码中使用的地方.
也许有人可以举例说明使用at()有意义的算法问题.
注:我已经用它最近在一些单元测试代码,其中加入指数校验码不被认为值得的麻烦和抛出的异常out_of_range at()被认为是足够的信息+背景的情况下,测试中断.
注意:关于ildjarn的这个答案 - 我不想就此开始讨论或评论.我在"积极"的兴趣所在,那就是具体的例子它已被使用.谢谢.
我从远程网站上使用open-uri获取图像,并在Ruby on Rails应用程序中将它们保存在我的本地服务器上.大多数图像显示没有问题,但有些图像没有出现.
一个很长的调试会话后,我终于找到了(感谢我这篇文章),对于这种情况的原因是,class Buffer在开放的URI libary对待与文件大小小于作为IO对象,而不是临时文件10KB.
我设法通过Micah Winkelspecht对这个StackOverflow问题的回答解决了这个问题,我将以下代码放在我的初始化器中的文件中:
require 'open-uri'
# Don't allow downloaded files to be created as StringIO. Force a tempfile to be created.
OpenURI::Buffer.send :remove_const, 'StringMax' if OpenURI::Buffer.const_defined?('StringMax')
OpenURI::Buffer.const_set 'StringMax', 0
Run Code Online (Sandbox Code Playgroud)
到目前为止,这可以按预期工作,但我一直在想,为什么他们首先将这些代码放入库中?有没有人知道一个特定的原因,为什么10kb以下的文件被视为StringIO?
由于上面的代码实际上为我的整个应用程序全局重置了这种行为,我只想确保我没有破坏其他任何东西.
通常只能比较C++中的指针是否相等.相比之下,只有指向同一完整对象(例如数组元素)的子对象的两个指针才允许小于比较.
因此T * p, * q,评估一般是非法的p < q.
标准库包含函数类模板std::less<T>等,它包含内置运算符<.但是,标准有关于指针类型(20.8.5/8)的说法:
对于模板
greater,less,greater_equal,和less_equal,对于任何指针类型的专业化产生总订单,即使内置的运营商<,>,<=,>=没有.
怎么能实现呢?甚至可以实现这个吗?
我看了看GCC 4.7.2和3.2锵,不包含任何的指针类型专业化的.它们似乎依赖于<在所有支持的平台上无条件地有效.
在并发库GHC.Conc中有一个名为的函数numCapabilities.它的类型是numCapabilities :: Int,它实际上返回一些你通过命令行标志传递的数字(例如,5如果选项是+RTS -N 5).
但是,getArgs(type IO [String]:)基本上相同(它返回未解析的非运行时参数)但不是纯函数.
如果唯一借口是numCapabilities往往需要在纯代码,以什么方式不其他命令行选项不能在纯代码需要?
我缺少什么或者是numCapabilities设计缺陷还是我允许写下面的怪物?
myGetArgs = unsafePerformIO getArgs
Run Code Online (Sandbox Code Playgroud) standard-library ×10
c++ ×6
python ×2
accessor ×1
c++-faq ×1
collections ×1
exception ×1
haskell ×1
map ×1
pointers ×1
predicate ×1
python-3.x ×1
ruby ×1
timestamp ×1