小编Jon*_*let的帖子

使用pyparsing改进错误消息

编辑:我做了第一个版本,Eike帮我推进了很多.我现在坚持一个更具体的问题,我将在下面描述.您可以查看历史记录中的原始问题


我正在使用pyparsing来解析用于从数据库请求特定数据的小语言.它具有许多关键字,运算符和数据类型以及布尔逻辑.

我正在尝试改进发出语法错误时发送给用户的错误消息,因为当前的错误消息不是很有用.我设计了一个小例子,类似于我正在用上述语言做的但是要小得多:

#!/usr/bin/env python                            

from pyparsing import *

def validate_number(s, loc, tokens):
    if int(tokens[0]) != 0:
        raise ParseFatalException(s, loc, "number musth be 0")

def fail(s, loc, tokens):
    raise ParseFatalException(s, loc, "Unknown token %s" % tokens[0])

def fail_value(s, loc, expr, err):
    raise ParseFatalException(s, loc, "Wrong value")

number =  Word(nums).setParseAction(validate_number).setFailAction(fail_value)
operator = Literal("=")

error = Word(alphas).setParseAction(fail)
rules = MatchFirst([
    Literal('x') + operator + number,
])

rules = operatorPrecedence(rules | error , [
    (Literal("and"), 2, opAssoc.RIGHT),
])

def try_parse(expression): …
Run Code Online (Sandbox Code Playgroud)

python pyparsing

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

如何使用 lxml 解析包含前缀但没有命名空间声明的 XML?

我有一堆使用前缀但没有相应命名空间声明的 XML 文件。

像这样的东西:

<tal:block tal:condition="foo">
...
</tal:block>
Run Code Online (Sandbox Code Playgroud)

或者:

<div i18n:domain="my-app">
...
Run Code Online (Sandbox Code Playgroud)

我知道这些前缀来自哪里,我尝试了以下方法,但没有成功:

from lxml import etree as ElementTree

ElementTree.register_namespace("i18n", "http://namespaces.zope.org")
ElementTree.register_namespace("tal", "http://xml.zope.org/namespaces/tal")

with open(path) as fp:
    tree = ElementTree.parse(fp)
Run Code Online (Sandbox Code Playgroud)

但 lxml 仍然窒息:

lxml.etree.XMLSyntaxError: Namespace prefix i18n for domain on div is not defined, line 4, column 20
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用ElementTree.XMLParser(recover=True),但无论如何我想保留前缀,而这种方法没有。

任何的想法?

python xml lxml xml-namespaces

6
推荐指数
1
解决办法
4690
查看次数

如何在全屏上更改Gtk应用程序的布局?

我正在开发使用Python和GTK另一个图像浏览器和查看器是目前非常简单:它由一个GtkWindowGtkTreeView左侧显示我的图片列表中,并且GtkImage在右侧,显示实际图像.到现在为止还挺好.

现在,我想全屏显示,只显示黑色背景等图像.

我可以看到几种方法:

  • 我可以隐藏()的窗口,并显示一个大的GtkImage,而不是,但我失去之前(信号为例)的窗口上我的设置,而我躲在肚里全屏窗口,这是一个有点所有的东西奇怪的;
  • 我可以隐藏()窗口的内容,去掉窗口的内容(这只能有一个孩子,据我知道吗?),并把GtkImage里面,而不是(做在退出全屏相反);
  • 我可以尝试使用窗口内的容器,并在窗口全屏/退出全屏时隐藏/显示其内容.更确切地说,我正在考虑添加另一个GtkHBox作为我的窗口的直接孩子,有两个孩子,并且在"正常"模式下仅显示第一个,而在全屏上仅显示第二个.

这一切看起来都有点hacky,所以我想知道处理这种情况的推荐方法是什么.谢谢!

python gtk user-interface pygobject

6
推荐指数
1
解决办法
2266
查看次数

模拟串口

是否可以创建通过"虚拟"串行端口发送数据的"虚拟"串行设备?我需要开发一些代码来与Arduino进行交互,但是不需要它.可以用socat或写入dev/ttyXXX文件的一些代码来完成吗?

编辑:我正在运行Arch Linux

c++ serial-port arduino socat

6
推荐指数
1
解决办法
3519
查看次数

如何在 SQL 中获得“其余的前 X”?

假设我有一个包含“名称”和“数量”列的表,我想获取出现次数最多的前 X 个产品,以及另一行,它是所有其他产品的总和。

我们可以以此示例 SQL 脚本为例:

CREATE TEMPORARY TABLE product
(
    name TEXT,
    quantity INT
);

INSERT INTO product (name, quantity)
VALUES
    ('carrot', 5),
    ('tomato', 1),
    ('potato', 3),
    ('grape', 8),
    ('salad', 10);
Run Code Online (Sandbox Code Playgroud)

从这个样本集中,我想检索这种结果:

name    quantity
----------------
salad   10
grape   8
others  9
Run Code Online (Sandbox Code Playgroud)

我目前正在使用以下解决方案,但我想知道是否有更漂亮和/或更高效的方法:

WITH top AS (
      SELECT name, 
             quantity
        FROM product
    ORDER BY quantity DESC
    LIMIT 2),
     without AS (
      SELECT 'others' AS other, 
             sum(product.quantity) AS quantity
        FROM product
       WHERE product.name NOT IN (SELECT name FROM top)
    GROUP BY …
Run Code Online (Sandbox Code Playgroud)

sql postgresql

5
推荐指数
1
解决办法
1147
查看次数

如何使用Python在Windows上授权/拒绝对目录的写访问?

我希望能够授权或拒绝对Windows XP及更高版本上特定目录的写访问。

我尝试了以下方法,但它们都不起作用:

  • os.chmod():只能指定文件只读属性,请参见Python的文档
  • win32api.SetFileAttribute() FILE_ATTRIBUTE_READONLY:只读文件。[...]在目录中不使用此属性,请参见MSDN的SetFileAttribute

看来我唯一的选择就是访问和更新“ 安全信息 ”,我已经尝试了好几个小时才能完成一些工作,但收效甚微(我对Win32 API确实不熟悉)。

关于如何做到这一点的任何想法?

python windows winapi authorization

3
推荐指数
1
解决办法
1900
查看次数

如何使用python过滤文件中的井号?

文件内容如下:

##this is the comment

but this is not comment '####', LOL   # this is a normal comment
Run Code Online (Sandbox Code Playgroud)

我只是想过滤所有评论并获得过滤后的内容,但我不知道如何避免过滤不是评论的英镑符号.

fileLines = [line.strip() for line in file if '#' != line[0] ]
Run Code Online (Sandbox Code Playgroud)

这段代码只是可以过滤注释符号,这是一行的第一个字符.

我想要的结果就像下面一行:

but this is not comment '####', LOL
Run Code Online (Sandbox Code Playgroud)

python

0
推荐指数
1
解决办法
347
查看次数