小编Ben*_*oyt的帖子

如何在Python提示符处引发错误后获取最后一个异常对象?

在交互式提示符(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提示符下的最后一个异常对象.

python exception try-catch read-eval-print-loop

49
推荐指数
2
解决办法
2万
查看次数

在Python中将Unicode URL转换为ASCII(UTF-8%转义)的最佳方法?

我想知道什么是最好的方法 - 或者如果标准库有一个简单的方法 - 将域名和路径中的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)

python unicode url utf-8

28
推荐指数
2
解决办法
2万
查看次数

为什么带有shell = True的subprocess.Popen()在Linux与Windows上的工作方式不同?

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之间存在差异?

python shell subprocess popen

20
推荐指数
2
解决办法
2万
查看次数

如何使用GraphQL架构进行类似JSON Schema的数据验证?

我们正在研究将GraphQL用于我们正在开发的无头CMS的第2版.

在这个CMS的第1版中,我们使用JSON Schema在保存到数据库之前根据模式验证每个文档 - 例如,如果它是博客文章,它将根据Article模式进行验证,如果它是一个综合("最好的"列表"它将根据Roundup架构进行验证.

对于版本2,我们正在考虑将GraphQL用于API.然后我们发现GraphQL模式基本上与JSON模式并行 - 它描述了文档结构,字段类型等.

因此,我们可以简单地使用"一个模式真实来源",即GraphQL模式,并在保存新版本时使用它来查询文档和验证新文档.(请注意,我正在讨论针对GraphQL架构验证JSON数据,而不是针对架构验证GraphQL查询.)

我认为数据将针对架构中的所有字段进行验证,但已弃用的字段除外,因为您只想验证字段的"最新版本".

我们可以做以下三件事之一:

  1. 直接使用GraphQL AST来验证文档,即自己编写数据验证器.
  2. 使用GraphQL AST生成JSON模式,并使用标准JSON模式验证器来实际验证它.
  3. 只是接受GraphQL不太适合验证,并定义模式两次 - 一次在GraphQL中进行查询,再次在JSON Schema中进行验证(烦人且容易出错以保持同步).

问题:#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 validation json jsonschema graphql

19
推荐指数
1
解决办法
1346
查看次数

如何使用os.scandir()以递归方式在目录树上返回DirEntry对象?

Python 3.5的os.scandir(path)函数返回轻量级DirEntry对象,这些对象对文件信息非常有帮助.但是,它只适用于传递给它的直接路径.有没有办法将它包装在递归函数中,以便它访问给定路径下的所有子目录?

python python-3.x

16
推荐指数
1
解决办法
2万
查看次数

为什么"导入模块"然后"从包导入模块"再次加载模块?

我的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做到人们期望的呢?

python module package python-import

13
推荐指数
1
解决办法
1667
查看次数

在AWK中,为什么像$(NF + 1)这样不存在的字段不等于零?

当使用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 …

awk

13
推荐指数
1
解决办法
267
查看次数

如何比cPickle更快地将1GB对象反序列化为Python?

我们有一个基于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中有没有办法做到这一点,或者实现类似的东西?

python serialization pickle deserialization

12
推荐指数
2
解决办法
5197
查看次数

需要UIWebView中的内容才能快速显示

我的应用程序的一部分缓存网页以供离线查看.为此,我保存从站点获取的HTML并重写img urls以指向本地存储上的文件.当我将html加载到UIWebView中时,它会按预期加载图像,一切都很好.我也是以这种方式缓存样式表.

问题是,当我将手机置于飞行模式时,加载此缓存的html会导致UIWebView显示空白屏幕并在显示页面之前暂停一段时间.我发现它是由Web视图试图获取的原始HTML文档引用的非缓存URL引起的.这些其他URL包括缓存样式表中的图像,iframe中的内容以及用于打开连接以获取其他资源的javascript.当UIWebView尝试获取这些资源时会发生暂停,并且只有在所有这些其他提取超时后才会显示该网页.

我的问题是,如何让UIWebView显示我立即缓存的内容?这是我的想法:

  • 写更多代码来缓存这些其他引用.这可能需要更多代码来捕获所有边缘情况等,尤其是必须解析Javascript以查看在加载页面后它加载的内容
  • 强制UIWebView立即超时,所以没有暂停.我还没弄明白怎么做.
  • 以某种方式获取已经加载的内容,即使外部引用尚未完成提取
  • 剥离所有脚本的代码,链接标签和iframe以"擦除"外部引用.我试过这个,但对于某些网站,结果页面严重搞砸了

有人能帮我一下吗?我一直在努力解决这个问题,而且我的想法已经不多了.

iphone cocoa-touch timeout uiwebview

11
推荐指数
1
解决办法
2万
查看次数

基于Windows 8 XAML的应用程序是否明显快于HTML/CSS应用程序?

我们正在研究开发一款Windows 8 Metro风格的应用程序,它的照片非常重,因此我们关注UI性能.在iOS上这是一个简单的决定(Objective-C over HTML来获得我们需要的UI性能),但研究Windows 8我很难说XAML比HTML5/CSS快多少.

我已经看到了XAML和HTML5(如之间的一般比较这一个),并有一个SO答案触摸性能,但不提供数据来支持他的要求或解释为什么XAML更快.

根据我的阅读,HTML5/CSS使用IE10的渲染引擎进行渲染,这意味着它不是超级原生的,可能会更慢.但是我不确定XAML是如何渲染的,或者它是如何"原生"的.

有没有人在两种技术之间进行性能比较,或者您是否可以提供链接以进一步解释每种技术的呈现方式(考虑到性能)?

html5 xaml microsoft-metro windows-8 winrt-xaml

11
推荐指数
1
解决办法
3533
查看次数