在交互式提示符(REPL)上调试Python代码时,我经常会编写一些引发异常的代码,但是我没有将它包装在try/中except,所以一旦引发错误,我就永远丢失了异常对象.
通常Python打印出来的追溯和错误消息是不够的.例如,在获取URL时,服务器可能会返回40x错误,并且您需要通过error.read()... 的响应内容,但您还没有得到错误对象.例如:
>>> import urllib2
>>> f = urllib2.urlopen('http://example.com/api/?foo=bad-query-string')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
...
urllib2.HTTPError: HTTP Error 400: Bad Request
Run Code Online (Sandbox Code Playgroud)
Drat,回应的主体说了什么?它可能包含有价值的错误信息......
我意识到重新运行包含在try/except中的代码通常很容易,但这并不理想.我也意识到在这种特殊情况下,如果我使用的是requests库(不会引起HTTP错误),我就不会有这个问题...但我真的很想知道是否有更通用的方法来获取在这些情况下,Python提示符下的最后一个异常对象.
我想知道什么是最好的方法 - 或者如果标准库有一个简单的方法 - 将域名和路径中的Unicode字符转换为等效的ASCII URL,使用域编码为IDNA和路径% -encoded,根据RFC 3986.
我从用户那里得到一个UTF-8的URL.因此,如果他们输入http://?.ws/?我'http://\xe2\x9e\xa1.ws/\xe2\x99\xa5'的Python.我想要的是ASCII版本:'http://xn--hgi.ws/%E2%99%A5'.
我现在所做的是通过正则表达式将URL拆分为多个部分,然后手动对域进行IDNA编码,并使用不同的urllib.quote()调用单独编码路径和查询字符串.
# url is UTF-8 here, eg: url = u'http://?.ws/?'.encode('utf-8')
match = re.match(r'([a-z]{3,5})://(.+\.[a-z0-9]{1,6})'
r'(:\d{1,5})?(/.*?)(\?.*)?$', url, flags=re.I)
if not match:
raise BadURLException(url)
protocol, domain, port, path, query = match.groups()
try:
domain = unicode(domain, 'utf-8')
except UnicodeDecodeError:
return '' # bad UTF-8 chars in domain
domain = domain.encode('idna')
if port is None:
port = ''
path = urllib.quote(path)
if query is None:
query = '' …Run Code Online (Sandbox Code Playgroud) 当subprocess.Popen(args, shell=True)用于运行" gcc --version"(仅作为示例)时,在Windows上我们得到:
>>> from subprocess import Popen
>>> Popen(['gcc', '--version'], shell=True)
gcc (GCC) 3.4.5 (mingw-vista special r3) ...
Run Code Online (Sandbox Code Playgroud)
因此,按照我的预期很好地打印出版本.但是在Linux上我们得到了这个:
>>> from subprocess import Popen
>>> Popen(['gcc', '--version'], shell=True)
gcc: no input files
Run Code Online (Sandbox Code Playgroud)
因为gcc还没有收到--version选项.
文档没有明确指出Windows下args应该发生什么,但它确实说,在Unix上,"如果args是一个序列,第一个项目指定命令字符串,任何其他项目将被视为额外的shell参数".恕我直言,Windows方式更好,因为它允许您将Popen(arglist)呼叫视为Popen(arglist, shell=True)一个.
为什么Windows和Linux之间存在差异?
我们正在研究将GraphQL用于我们正在开发的无头CMS的第2版.
在这个CMS的第1版中,我们使用JSON Schema在保存到数据库之前根据模式验证每个文档 - 例如,如果它是博客文章,它将根据Article模式进行验证,如果它是一个综合("最好的"列表"它将根据Roundup架构进行验证.
对于版本2,我们正在考虑将GraphQL用于API.然后我们发现GraphQL模式基本上与JSON模式并行 - 它描述了文档结构,字段类型等.
因此,我们可以简单地使用"一个模式真实来源",即GraphQL模式,并在保存新版本时使用它来查询文档和验证新文档.(请注意,我正在讨论针对GraphQL架构验证JSON数据,而不是针对架构验证GraphQL查询.)
我认为数据将针对架构中的所有字段进行验证,但已弃用的字段除外,因为您只想验证字段的"最新版本".
我们可以做以下三件事之一:
问题:#1和#2愚蠢的想法?是否有任何GraphQL工具可以进行这种数据验证?如果没有定义两次架构,还有其他方法可以实现吗?
作为参考,我们的后端将用Python编写,但管理UI将是客户端的React和JavaScript.这是我们正在讨论的GraphQL架构的缩减版本(支持"Article"和"Roundup"文档类型):
schema {
query: Query
}
type Query {
documents: [Document!]!
document(id: Int): Document!
}
interface Document {
id: Int!
title: String!
}
type Article implements Document {
id: Int!
title: String!
featured: Boolean!
sections: [ArticleSection!]!
}
union ArticleSection = TextSection | PhotoSection | VideoSection
type TextSection {
content: String!
heading: String
}
type PhotoSection …Run Code Online (Sandbox Code Playgroud) Python 3.5的os.scandir(path)函数返回轻量级DirEntry对象,这些对象对文件信息非常有帮助.但是,它只适用于传递给它的直接路径.有没有办法将它包装在递归函数中,以便它访问给定路径下的所有子目录?
我的PYTHONPATH中有一个看起来像这样的包:
package/
__init__.py
module.py
print 'Loading module'
Run Code Online (Sandbox Code Playgroud)
如果我从package/目录运行Python (或在此目录中编写另一个模块)并键入
import module
Run Code Online (Sandbox Code Playgroud)
它加载module.py并按预期打印出"加载模块".但是,如果我再输入
from package import module
Run Code Online (Sandbox Code Playgroud)
它加载module.py并再次打印"加载模块" ,这是我没想到的.这是什么理由?
注意:我认为我从技术上理解为什么Python会这样做,因为sys.modules键import module只是"module",但是对于from package import module它来说"package.module".所以我想我想知道的是为什么密钥在这里是不同的 - 为什么文件的路径名不是用作密钥,以便Python做到人们期望的呢?
当使用AWK时,我很难理解为什么不存在的字段(后面的字段$NF)不等于等于数字零.
在下面的示例中,输入行有两个字段,因此根据规范$3应该是"未初始化的值"并且比较等于0.换句话说,$3 == 0应该返回true,但正如您在下面看到的那样它返回false:
$ echo '1 2' | awk '{ print($3 == 0 ? "t" : "f") }'
f
Run Code Online (Sandbox Code Playgroud)
"One True AWK"(版本20121220)和GNU AWK(版本4.2.1)的行为方式相同.这是GNU AWK输出:
$ echo '1 2' | gawk '{ print($3 == 0 ? "t" : "f") }'
f
Run Code Online (Sandbox Code Playgroud)
根据POSIX AWK规范,不存在的字段$3应该是未初始化的值:
对不存在的字段(即$ NF之后的字段)的引用应评估为未初始化的值.
此外,==如果一个操作数是数字而另一个是未初始化的值,则应该以数字方式进行比较:
比较(使用'<',"<=","!=","==",">"和"> ="运算符)如果两个操作数都是数字,则应以数字方式进行比较,如果一个是数字,则other的字符串值是数字字符串,或者如果一个是数字而另一个是未初始化的值.否则,操作数应根据需要转换为字符串......
最后,未初始化的值的"数值"应为零:
未初始化的值应具有零值的数值和空字符串的字符串值.
将此与未初始化的变量进行对比,该变量的确比较等于零:
$ awk 'BEGIN { print(x == 0 ? "t" : "f") }'
t
Run Code Online (Sandbox Code Playgroud)
所以在我们的第一个例子中,$3 …
我们有一个基于Python的Web服务器,它可以在启动时使用大量数据文件cPickle.数据文件(使用pickled HIGHEST_PROTOCOL)在磁盘上大约为0.4 GB,并加载到内存中大约1.2 GB的Python对象 - 这大约需要20秒.我们在64位Windows机器上使用Python 2.6.
瓶颈肯定不是磁盘(实际读取那么多数据需要不到0.5秒),但是内存分配和对象创建(创建了数百万个对象).我们希望减少20秒以减少启动时间.
有没有办法将超过1GB的对象反序列化到Python中cPickle(比如5-10x)?因为执行时间受内存分配和对象创建的约束,所以我假设使用另一种解开技术(如JSON)在这里没有帮助.
我知道有些解释型语言可以将整个内存映像保存为磁盘文件,因此可以一次性将其加载回内存,而无需为每个对象分配/创建.在Python中有没有办法做到这一点,或者实现类似的东西?
我的应用程序的一部分缓存网页以供离线查看.为此,我保存从站点获取的HTML并重写img urls以指向本地存储上的文件.当我将html加载到UIWebView中时,它会按预期加载图像,一切都很好.我也是以这种方式缓存样式表.
问题是,当我将手机置于飞行模式时,加载此缓存的html会导致UIWebView显示空白屏幕并在显示页面之前暂停一段时间.我发现它是由Web视图试图获取的原始HTML文档引用的非缓存URL引起的.这些其他URL包括缓存样式表中的图像,iframe中的内容以及用于打开连接以获取其他资源的javascript.当UIWebView尝试获取这些资源时会发生暂停,并且只有在所有这些其他提取超时后才会显示该网页.
我的问题是,如何让UIWebView显示我立即缓存的内容?这是我的想法:
有人能帮我一下吗?我一直在努力解决这个问题,而且我的想法已经不多了.
我们正在研究开发一款Windows 8 Metro风格的应用程序,它的照片非常重,因此我们关注UI性能.在iOS上这是一个简单的决定(Objective-C over HTML来获得我们需要的UI性能),但研究Windows 8我很难说XAML比HTML5/CSS快多少.
我已经看到了XAML和HTML5(如之间的一般比较这一个),并有一个SO答案是触摸性能,但不提供数据来支持他的要求或解释为什么XAML更快.
根据我的阅读,HTML5/CSS使用IE10的渲染引擎进行渲染,这意味着它不是超级原生的,可能会更慢.但是我不确定XAML是如何渲染的,或者它是如何"原生"的.
有没有人在两种技术之间进行性能比较,或者您是否可以提供链接以进一步解释每种技术的呈现方式(考虑到性能)?
python ×7
awk ×1
cocoa-touch ×1
exception ×1
graphql ×1
html5 ×1
iphone ×1
json ×1
jsonschema ×1
module ×1
package ×1
pickle ×1
popen ×1
python-3.x ×1
shell ×1
subprocess ×1
timeout ×1
try-catch ×1
uiwebview ×1
unicode ×1
url ×1
utf-8 ×1
validation ×1
windows-8 ×1
winrt-xaml ×1
xaml ×1