在现代Python中声明自定义异常类的正确方法是什么?我的主要目标是遵循标准的其他异常类,因此(例如)我在异常中包含的任何额外字符串都会被捕获异常的任何工具打印出来.
通过"现代Python",我指的是将在Python 2.5中运行的东西,但对于Python 2.6和Python 3*的处理方式来说是"正确的".而"自定义"我指的是一个Exception对象,它可以包含有关错误原因的额外数据:一个字符串,也许还有一些与异常相关的任意对象.
我被Python 2.6.2中的以下弃用警告绊倒了:
>>> class MyError(Exception):
... def __init__(self, message):
... self.message = message
...
>>> MyError("foo")
_sandbox.py:3: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
Run Code Online (Sandbox Code Playgroud)
看起来很疯狂,BaseException对于名为的属性具有特殊含义message.我从PEP-352收集到该属性确实在2.5中有特殊含义他们试图弃用,所以我猜这个名字(而且仅此一个)现在被禁止了?啊.
我也模糊地意识到它Exception有一些神奇的参数args,但我从来不知道如何使用它.我也不确定这是向前发展的正确方法; 我在网上发现的很多讨论都表明他们试图在Python 3中废除args.
更新:两个答案建议覆盖__init__,和__str__/ __unicode__/ __repr__.这似乎很多打字,是否有必要?
我正在编写一些Javascript代码,用于在客户端生成XML文档(通过Google Earth插件).我希望用户能够单击页面上的按钮并提示将该XML保存到新文件.如果我在生成XML服务器端这很容易,只需让按钮打开链接即可.但是XML是在客户端生成的.
我想出了一些半工作的黑客,部分受到StackOverflow问题的启发.但是没有完全奏效.这是一个包含嵌入代码的演示HTML:
<html><head><script>
function getData() { return '<?xml version="1.0" encoding="UTF-8"?><doc>Hello</doc>'; }
function dlDataURI() {
window.open("data:text/xml;charset=utf-8," + getData());
}
function dlWindow() {
var w = window.open();
w.document.open();
w.document.write(getData());
w.document.close();
}
</script><body>
<div onclick="dlDataURI()">Click for Data URL</div>
<div onclick="dlWindow()">Click for Window</div>
</body></html>
Run Code Online (Sandbox Code Playgroud)
dlDataURI()版本在Firefox中运行良好,在Chrome中运行不佳(无法保存),在IE中根本不运行.Window()版本在Firefox和IE中运行良好,在Chrome中运行不佳(无法保存,HTML内嵌的XML).这两个版本都没有提示用户下载,它总是打开一个试图显示XML的新窗口.
有没有一种方法可以在客户端Javascript中做我想要的?我想在今天的浏览器中使用它,最好是Firefox,MSIE 8和Chrome.
使用示例Downloadify代码进行更新
window.onload = function() {
Downloadify.create("dlify", {
data: getData(),
filename: "data.xml",
swf: 'media/downloadify.swf',
downloadImage: 'images/download.png',
width: 100, height: 30});};
Run Code Online (Sandbox Code Playgroud) 我对String格式化中的以下Python 2.7和Python 3.3行为感到困惑.这是一个关于逗号运算符如何与字符串表示类型交互的挑剔细节问题.
>>> format(10000, ",d")
'10,000'
>>> format(10000, ",")
'10,000'
>>> format(10000, ",s")
ValueError: Cannot specify ',' with 's'.
>>> "{:,}".format(10000)
'10,000'
>>> "{:,s}".format(10000)
ValueError: Cannot specify ',' with 's'.
Run Code Online (Sandbox Code Playgroud)
让我感到困惑的是,变体的工作原理,没有明确的字符串表示类型.该文档说,如果省略类型,它的"同为s".然而在这里它的表现与众不同s.
我认为这只是一个皱纹/角落的情况,但这个语法在文档中用作示例:'{:,}'.format(1234567890).当省略字符串表示类型时,Python中是否隐藏了其他"特殊"行为?也许代码"与s相同"代码实际上在做的是检查被格式化的东西的类型?