假设我在vim中有这行文本:
(foo bar (baz) qux)
^
Run Code Online (Sandbox Code Playgroud)
我的光标位于foo
和之间的空间上bar
.我经常发现,在这样的情况下,我想删除外部括号表达式的整个右侧(即光标右侧),同时保持左侧不变.也就是说,我最终会:
(foo)
Run Code Online (Sandbox Code Playgroud)
通常,我会用dt)
("删除直到)
")完成此操作,但添加嵌套括号会使事情变得复杂:该命令会让我失望(foo) qux)
.我也可以使用d2t)
,但我不想手动计算嵌套括号的数量.我也可以使用di)
,但是删除括号中的整个内部,留下我()
.
是否有一个vim运动,具有平衡意识的i
- 和 - 修改的a
运动但是相对于当前光标位置?
我真的希望我的Python应用程序在内部专门处理Unicode字符串.这对我来说最近很顺利,但我遇到了处理路径的问题.用于文件系统的POSIX API不是Unicode,因此文件可能(实际上有点常见)具有"不可解码"名称:文件系统未声明的文件名称.
在Python中,这表现为返回的对象unicode
和str
对象的混合os.listdir()
.
>>> os.listdir(u'/path/to/foo')
[u'bar', 'b\xe1z']
Run Code Online (Sandbox Code Playgroud)
在该示例中,字符'\xe1'
以Latin-1或某些形式编码,即使(假设的)文件系统报告sys.getfilesystemencoding() == 'UTF-8'
(在UTF-8中,该字符将是两个字节'\xc3\xa1'
).出于这个原因,UnicodeError
如果您尝试使用os.path.join()
Unicode路径,那么您将遍布整个地方,因为文件名无法解码.
在Python的Unicode指南提供有关Unicode路径名这样的建议:
请注意,在大多数情况下,应使用Unicode API.字节API只应用于可以存在不可解码文件名的系统,即Unix系统.
因为我主要关心Unix系统,这是否意味着我应该重构我的程序以仅处理路径的字节串?(如果是这样,我如何保持Windows兼容性?)或者还有其他更好的方法来处理不可解码的文件名吗?它们是否"非常稀有",我应该让用户重命名他们该死的文件?
(如果最好只在内部处理字节串,我有一个后续问题:如何在SQLite中为一列存储字节串,同时将其余数据保存为友好的Unicode字符串?)
我正在编写一个使用Python Gstreamer绑定来播放音频的应用程序,但我现在还试图解码音频 - 也就是说,我想使用a读取数据decodebin
并接收原始PCM缓冲区.具体来说,我想逐步读取文件的块,而不是将整个文件读入内存.
一些具体问题:如何通过Gstreamer实现这一目标?特别是pygst?是否需要使用特定的"接收器"元素来从流中读取数据?有没有从pygst Buffer
对象读取数据的首选方法?如何控制消耗数据的速率(而不仅仅是输入"主循环")?
在多线程Python程序中,一个线程有时会使用内置的raw_input()来请求控制台输入.我希望能够在raw_input提示符下通过在shell中键入^ C来关闭程序(即,使用SIGINT信号).但是,当子线程正在执行raw_input时,键入^ C什么也不做 - 在我点击返回(离开raw_input)之前不会引发KeyboardInterrupt.
例如,在以下程序中:
import threading
class T(threading.Thread):
def run(self):
x = raw_input()
print x
if __name__ == '__main__':
t = T()
t.start()
t.join()
Run Code Online (Sandbox Code Playgroud)
键入^ C在输入完成之前不会执行任何操作.但是,如果我们只是调用T().run()
(即,单线程情况:只在主线程中运行raw_input),^ C立即关闭程序.
据推测,这是因为SIGINT被发送到主线程,它被挂起(等待GIL),而分支线程在控制台上阻塞读取.主线程在raw_input返回后抓取GIL之前不会执行其信号处理程序.(如果我错了,请纠正我 - 我不是Python线程实现方面的专家.)
有没有办法以类似raw_input的方式从stdin读取,同时允许主线程处理SIGINT,从而降低整个过程?
[我在Mac OS X和一些不同的Linux上观察到了上述行为.]
编辑:我错误地描述了上面的根本问题.在进一步调查中,主要线程的呼吁join()
是阻止信号处理:Guido van Rossum本人已经解释说,加入中的底层锁定是不可中断的.这意味着信号实际上被推迟到整个线程完成 - 所以这实际上完全没有任何关系raw_input
(只是后台线程阻塞以便连接没有完成的事实).
我正在以函数式风格编写编译器。类型检查器目前相当简单:它(大部分)只是一个函数 from Expr
to Type
。
现在,我想在工作流中添加一个步骤,为后续阶段保留类型信息。有很多方法可以做到这一点(符号表等),但一个简单的方法是将其转换为一个看起来像 AST 但包含类型信息的 IR。例如,如果 AST 数据类型是:
datatype Expr = Literal of int
| Add of Expr * Expr
| ...
Run Code Online (Sandbox Code Playgroud)
然后键入的 IR 将是:
type TExpr = Type * TExpr'
datatype TExpr' = TLiteral of int
| TAdd of TExpr * TExpr
| ...
Run Code Online (Sandbox Code Playgroud)
所以我现在的目标是将我的类型检查器转换为类型注释器:一个函数Expr -> TExpr
而不是Expr -> Type
. 这是我的问题:如果不向类型检查器功能添加一堆样板混乱,您将如何做到这一点?
天真地,我需要到处添加包装和解包代码,破坏了类型检查器功能的简单易读性。也就是说,Add
类型检查器中的情况目前看起来像:
let lhs_t = check lhs in
let rhs_t = check rhs in
case (lhs_t, rhs_t) of
(Int, …
Run Code Online (Sandbox Code Playgroud) compiler-construction functional-programming abstract-syntax-tree typechecking
假设我正在声明一个类,C
并且一些声明非常相似.我想使用一个函数f
来减少这些声明的代码重复.可以f
像往常一样声明和使用:
>>> class C(object):
... def f(num):
... return '<' + str(num) + '>'
... v = f(9)
... w = f(42)
...
>>> C.v
'<9>'
>>> C.w
'<42>'
>>> C.f(4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unbound method f() must be called with C instance as first argument (got int instance instead)
Run Code Online (Sandbox Code Playgroud)
哎呀!我无意中暴露在外面f
的世界,但它不会引起self
争论(并且由于显而易见的原因不能).一种可能性是del
我使用它后的功能:
>>> class C(object):
... def f(num):
... return …
Run Code Online (Sandbox Code Playgroud) 假设我有一个命令我想运行(cmd
)和一个包含我想要传递给函数的参数的变量(类似的东西--foo 'bar baz' qux
).像这样:
#!/bin/sh
command=cmd
args="--foo 'bar baz' qux"
Run Code Online (Sandbox Code Playgroud)
参数包含引号,如上所示,它们将包含空格的参数组合在一起.然后我想运行命令:
$command $args
Run Code Online (Sandbox Code Playgroud)
这当然,导致与运行命令4个参数:--foo
,'bar
,baz'
,和qux
.我习惯的替代方案(即使用时"$@"
)会出现另一个问题:
$command "$args"
Run Code Online (Sandbox Code Playgroud)
这将使用一个参数执行命令:--foo 'bar baz' qux
.
我怎样才能运行该命令与3个参数(--foo
,bar baz
,和qux
)如预期?
假设客户对您创建脚本以完成收集某些信息并输出大量数据库文件的任务所做的工作感到满意.然后,他们有兴趣定期(大约每月一次)运行任务而无需人工干预.客户端对在本地运行任务不感兴趣,所以你不得不在其他地方找到它 - 在某个地方,就像它听起来的那样,"在云端."
你会用什么技术/服务来廉价地完成这项工作?
到目前为止我已经探索过的事情:
您对这些或任何其他选择有经验吗?