所有文档告诉我们的是,
当用户按下中断键(正常
Control-C或Delete)时触发.在执行期间,定期检查中断.
但是从代码的角度来看,我何时可以看到这个异常?它是否在语句执行期间发生?只有在陈述之间?它可以发生在表达的中间吗?
例如:
file_ = open('foo')
# <-- can a KeyboardInterrupt be raised here, after the successful
# completion of open but prior to the try? -->
try:
# try some things with file_
finally:
# cleanup
Run Code Online (Sandbox Code Playgroud)
这段代码会在合适的时间内泄漏KeyboardInterrupt吗?或者是在执行某些语句或表达式时引发的?
我正在使用SDK for CRM,并在我们的一个实体的一堆实例上打印出PK.我用数据库的过滤视图重复了它,得到了相同的答案:
1a6c691d-391a-de11-8b0e-0050568407cb
bd7b0ff0-391a-de11-8b0e-0050568407cb
ed272bfe-391a-de11-8b0e-0050568407cb
... and so on ...
这些似乎不是有效的GUID.首先,他们看错了 - 它们几乎完全相同,这是自从旧版本1和2 GUID基于MAC地址和时钟时间以来GUID没有的属性.而且,事实上GUID中的某个半字节表示GUID的版本 - 这里的半字节不正确.(第三部分的第一个半字节,即:1a6c691d-391a - **d**e11-8b0e-0050568407cb) - 有效值为1-5)(使用MS的GUID生成器生成GUID - 该插槽始终为4.(至少对于我的版本.))
这些GUID,还是ID,我怎么知道?
我们来看以下两个类:
public class CollectionOfChildren
{
public Child this[int index] { get; }
public void Add(Child c);
}
public class Child
{
public CollectionOfChildren Parent { get; }
}
Run Code Online (Sandbox Code Playgroud)
Child的Parent属性应始终返回Child所在的CollectionOfChildren,如果子节点不在此类集合中,则返回null.在这两个类之间,应该保持这个不变量,并且不应该被类的消费者破坏(很好,很容易).
你是如何实现这种关系的?CollectionOfChildren不能设置Child的任何私有成员,那么它应该如何通知Child它已被添加到集合中?(如果孩子已经是一个集合的一部分,则抛出异常是可以接受的.)
internal已提及该关键字.我现在正在编写一个WinForms应用程序,所以一切都在同一个程序集中,这基本上没有什么不同public.
用C++存储UTF-8字符串的最佳类型是什么?如果可能的话,我想避免自己上课.
我最初的想法是std::string- 然而,这char用作底层类型.char可能是未签名或签名 - 它会有所不同.在我的系统上,它已签名.但是,UTF-8代码单元是无符号八位字节.这似乎表明这是错误的类型.
这导致我们std::basic_string<unsigned char>- 这似乎符合法案:无符号,8位(或更大)字符.
但是,大多数事情似乎都在使用char.例如,glib使用char.C++ ostream的用法char.
思考?
在彩色模式下,我似乎无法在诅咒中工作.如果我不打电话start_color,我就会变黑了.我打电话的时候start_color,事情开始以黑灰色输出.
如果您运行此脚本:
import sys
for i in xrange(30, 38):
print '\x1b[0;' + str(i) + 'm' + str(i) + ': Shiny colors \x1b[1m(bright)'
print '\x1b[0m...and this is normal.'
Run Code Online (Sandbox Code Playgroud)
......你可能会看到很多漂亮的颜色.我想要但不能得到的是最后一句话:"......这是正常的." 要求颜色对0或要求COLOR_WHITE,COLOR_BLACK从脚本中获取非亮#37.
作为参考,这是我在Gnome终端中看到的:
http://rpi.edu/~wellir/random/colors.png
我用Python编程(使用curses库),所以我的代码是这样的:
import curses
screen = curses.initscr()
curses.start_color()
curses.init_pair(1, curses.COLOR_WHITE, curses.COLOR_BLACK)
screen.clear()
screen.attrset(0)
screen.addstr('Hello')
screen.attrset(curses.A_BOLD)
screen.addstr('Hello')
screen.attrset(curses.color_pair(1))
screen.addstr('Hello')
screen.refresh()
curses.napms(5000)
curses.endwin()
Run Code Online (Sandbox Code Playgroud)
......让我37,37-亮,37.
在CPython的当前实现中,存在称为"GIL"或"Global Interpreter Lock"的对象.它本质上是一个互斥锁,可以防止两个Python线程同时执行Python代码.这可以防止两个线程破坏Python解释器的状态,但也可以防止多个线程真正一起执行.基本上,如果我这样做:
# Thread A
some_list.append(3)
# Thread B
some_list.append(4)
Run Code Online (Sandbox Code Playgroud)
我无法破坏列表,因为在任何给定时间,只有其中一个线程正在执行,因为它们必须持有GIL才能执行此操作.现在,列表中的项目可能会以某种不确定的顺序添加,但关键是列表没有损坏,并且总会添加两件事.
所以,现在到C#.C#基本上面临与Python相同的问题,那么,C#如何阻止这种情况呢?如果有人知道的话,我也有兴趣听Java的故事.
澄清:我对没有显式锁定语句的情况感兴趣,特别是对VM.我知道Java和C#都存在锁定原语 - 它们也存在于Python中:GIL不用于多线程代码,只是为了保持解释器的理智.我对以上的直接等价感兴趣,所以,在C#中,如果我能够记得足够...... :-)
List<String> s;
// Reference to s is shared by two threads, which both execute this:
s.Add("hello");
// State of s?
// State of the VM? (And if sane, how so?)
Run Code Online (Sandbox Code Playgroud)
这是另一个例子:
class A
{
public String s;
}
// Thread A & B
some_A.s = some_other_value;
// some_A's state must change: how does it change?
// Is the VM still in good …Run Code Online (Sandbox Code Playgroud) 采取以下最小例子:
import abc
class FooClass(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def FooMethod(self):
raise NotImplementedError()
def main():
derived_type = type('Derived', (FooClass,), {})
def BarOverride(self):
print 'Hello, world!'
derived_type.FooMethod = BarOverride
instance = derived_type()
Run Code Online (Sandbox Code Playgroud)
跑步main()让你:
TypeError: Can't instantiate abstract class Derived with abstract methods FooMethod
Run Code Online (Sandbox Code Playgroud)
(该instance = derived_type()行发生异常.)
但FooMethod不应该是抽象的:我已经用它来覆盖它BarOverride.那么,为什么这会引发例外呢?
免责声明:是的,我可以使用显式class语法,并完成完全相同的事情.(甚至更好,我可以使它工作!)但这是一个最小的测试用例,更大的例子是动态创建类.:-)而且我很好奇为什么这不起作用.
编辑:并防止其他明显的非答案:我不想传递BarOverride第三个参数type:在真实的例子中,BarOverride需要derived_type绑定它.如果我可以BarOverride在创建之后定义,则更容易执行此操作derived_type.(如果我不能这样做,为什么呢?)
在Rust中声明vector类型的变量或哈希映射时,我们会:
let v: Vec<int>
let m: HashMap<int, int>
Run Code Online (Sandbox Code Playgroud)
要实例化,我们需要调用new().但是,我们这样做:
Vec::<int>::new()
^^
HashMap::<int, int>::new()
^^
Run Code Online (Sandbox Code Playgroud)
注意突然出现的::.来自C++,这些都很奇怪.为什么会这样?是否具有引导::使IDENTIFIER :: < IDENTFIER …容易解析比IDENTIFIER < IDENTIFIER,这可能会被解释为一个小于操作?(因此,这只是让语言更容易解析的一个问题吗?但是如果是这样的话,为什么不在类型规范中这样做,以便让两个镜像相互映射?)
(正如Shepmaster所说,经常Vec::new()就足够了;通常可以推断出这种类型.)
我一直在编写iostreams的二进制版本.它本质上允许您编写二进制文件,但可以很好地控制文件的格式.用法示例:
my_file << binary::u32le << my_int << binary::u16le << my_string;
Run Code Online (Sandbox Code Playgroud)
将my_int写为无符号的32位整数,将my_string写为长度前缀的字符串(前缀为u16le.)要读回文件,可以翻转箭头.效果很好.然而,我在设计上遇到了一个障碍,我仍然围着它.所以,是时候问问了.(我们做了一些假设,例如8位字节,2s补码整数和IEEE浮点数.)
引擎盖下的iostream使用streambufs.这真是一个梦幻般的设计 - iostreams编码' int'到文本的序列化,并让底层的streambuf处理其余的.因此,你得到cout,fstreams,stringstreams等.所有这些,包括iostream和streambufs,都是模板化的,通常是在char上,但有时也是一个wchar.但是,我的数据是一个字节流,最好用' unsigned char' 表示.
我的第一次尝试是基于的模板unsigned char.std::basic_string模板很好,但streambuf没有.我遇到了一个名为class的问题codecvt,我永远无法遵循这个unsigned char主题.这提出了两个问题:
1)为什么streambuf对此类事情负责?似乎代码转换不属于streambuf的职责 - streambufs应该采取流,并缓冲数据到/从它缓冲数据.而已.像代码转换一样高级的东西感觉它应该属于iostreams.
由于我无法使用模板化的streambuf来处理unsigned char,所以我回到char,只是在char/unsigned char之间传递数据.出于显而易见的原因,我试图尽量减少演员阵容.大多数数据基本上都是在read()或write()函数中结束,然后调用底层的streambuf.(并在此过程中使用强制转换.)读取功能基本上是:
size_t read(unsigned char *buffer, size_t size)
{
size_t ret;
ret = stream()->sgetn(reinterpret_cast<char *>(buffer), size);
// deal with ret for return size, eof, errors, etc.
...
}
Run Code Online (Sandbox Code Playgroud)
好的解决方案,糟糕的解
前两个问题表明需要更多信息.首先,查看了boost :: serialization等项目,但它们存在于更高级别,因为它们定义了自己的二进制格式.这更适用于较低级别的读/写,其中希望定义格式,或者已经定义了格式,或者不需要或不需要批量元数据.
其次,有些人询问了binary::u32le修饰符.它是一个类的实例化,它具有所需的字节顺序和宽度,此刻可能是未来的签名.该流保存该类的最后传递的实例的副本,并在序列化中使用该副本.这是一个解决方法,我个人试图重载<<运算符:
bostream &operator << (uint8_t n);
bostream &operator << …Run Code Online (Sandbox Code Playgroud)