我正在尝试在Vim中实现布尔函数,并且遇到了一些麻烦,并且我确定我缺少某些东西。
只是要清楚一点,我正在寻求实现一个函数,当调用!它时,它会起到相反的作用。
Vim有很多布尔函数,例如list和paste。就我而言,如果我说一个函数,则打开一个缓冲区,例如:
:call MyFunction()
Run Code Online (Sandbox Code Playgroud)
然后我想在用a调用时关闭缓冲区!:
:call MyFunction()!
Run Code Online (Sandbox Code Playgroud)
不知道这是否有可能,我不希望找到如何打开或关闭缓冲区,而是真正的布尔实现。
编辑:
如果我们谈论用户定义的命令,这似乎更可行:
:MyCommand action
Run Code Online (Sandbox Code Playgroud)
也可以称为:
:MyCommand action!
Run Code Online (Sandbox Code Playgroud) 我一直在编写命令行Python脚本,但最近我对速度感到非常沮丧.
我不一定谈论处理速度,调度任务或其他命令行工具特定的进程(这通常是设计/实现问题),而是我说的只是运行工具来获取帮助菜单或显示最少的信息.
例如,Mercurial大约为0.080scs,GIT大约为0.030scs
我已经研究过Mercurial的源代码(毕竟它是Python)但是得到快速响应脚本的答案仍然没有找到我.
我认为imports,你如何管理它们是最初减速的一个重要原因.但是,对于Python中快速响应的快速响应命令行脚本,是否有最佳实践?
导入os和optparse并执行main()来解析一些参数选项的单个Python脚本在我的机器上需要0.160scs才能显示帮助菜单...
这比运行git慢5倍!
编辑:
我不应该提到git,因为它是用C语写的.但Mercurial部分仍然存在,不,pyc不要感觉像是一个很大的改进(至少对我来说).
编辑2:
虽然延迟导入是Mercurial中加速的关键,但它们在常规Python脚本中的缓慢关键是没有自动生成的脚本pkg_resources,例如:
from pkg_resources import load_entry_point
Run Code Online (Sandbox Code Playgroud)
如果您手动生成的脚本不使用pkg_resources,您应该看到至少2倍的速度增加.
然而!请注意,pkg_resources确实提供了一种很好的版本依赖方式,因此请确保您知道不使用它基本上意味着可能的版本冲突.
我正在尝试对回溯进行一些精心的重新检查,并从未能返回更多(更好?)信息的对象中获取实际值以及回溯.
案例场景是在我导入和执行的函数中,如下所示:
def foo():
a = True
b = False
assert a == b
Run Code Online (Sandbox Code Playgroud)
并执行如下:
from foo import foo
def re_inspect():
try:
foo()
except Exception, e:
# re-inspect traceback and check `a` and `b`
Run Code Online (Sandbox Code Playgroud)
当AssertionError引发提升时,如果我尝试评估引发异常的行,我(当然)无法分辨出什么a或是b(NameError立即引发)因为我缺少代码的上下文.
请注意我无权访问,a也不会b导入上面的代码然后执行.由于foo不存在于当前名称空间中,我的问题依赖于从foo上下文中获取正确的值.
什么是正确的方法,能够告诉什么a,b以便y可以安全地说出类似:"一个是真的,是假的"?
我正在开发一个非常小的Python库,它必须是非阻塞的.
在某些生产代码上,在某些时候,将完成对此库的调用,并且它需要自己完成工作,以最简单的形式,它将是一个需要将某些信息传递给服务的可调用的.
这种"将信息传递给服务"是一项非密集型任务,可能会将一些数据发送到HTTP服务或类似的东西.它也不需要并发或共享信息,但它确实需要在某个时刻终止,可能需要超时.
我之前使用过该threading模块,它似乎是最合适的使用方法,但是使用这个库的应用程序是如此之大,以至于我担心会遇到线程限制.
在本地测试中,我能够达到约2500个线程产生的限制.
有一个很好的可能性(考虑到应用程序的大小)我可以很容易地达到这个限制.考虑到以高速率放置任务的内存含义,它也让我厌倦了使用队列.
我也看过了,gevent但是我看不到能够产生一些可以做某些工作并且没有加入就终止的东西的例子.我经历过的例子,在那里调用.join()了一个Greenletgreenwlet或一系列greenlets.
我不需要知道正在完成的工作的结果!它只需要启动并尝试与HTTP服务进行通信,如果没有,则会以合理的超时死亡.
我误解了指南/教程gevent吗?是否还有其他可能以完全非阻塞的方式生成一个无法达到~2500限制的可调用对象?
这是线程中的一个简单示例,它可以像我期望的那样工作:
from threading import Thread
class Synchronizer(Thread):
def __init__(self, number):
self.number = number
Thread.__init__(self)
def run(self):
# Simulating some work
import time
time.sleep(5)
print self.number
for i in range(4000): # totally doesn't get past 2,500
sync = Synchronizer(i)
sync.setDaemon(True)
sync.start()
print "spawned a thread, number %s" % i
Run Code Online (Sandbox Code Playgroud)
这就是我用gevent尝试过的,它显然会在最后阻止看到工人做了什么:
def task(pid):
"""
Some non-deterministic task
"""
gevent.sleep(1) …Run Code Online (Sandbox Code Playgroud) 我正在尝试从简单的表单中捕获 POST 数据。
这是我第一次使用 WSGIREF,我似乎找不到正确的方法来做到这一点。
This is the form:
<form action="test" method="POST">
<input type="text" name="name">
<input type="submit"></form>
Run Code Online (Sandbox Code Playgroud)
并且该函数显然缺少正确的信息来捕获帖子:
def app(environ, start_response):
"""starts the response for the webserver"""
path = environ[ 'PATH_INFO']
method = environ['REQUEST_METHOD']
if method == 'POST':
if path.startswith('/test'):
start_response('200 OK',[('Content-type', 'text/html')])
return "POST info would go here %s" % post_info
else:
start_response('200 OK', [('Content-type', 'text/html')])
return form()
Run Code Online (Sandbox Code Playgroud) 虽然这个问题类似于这个主题
我想在使用正则表达式构造代码时可能会出错.
我希望将一行中的任何内容与注释("#")或行尾(如果它没有注释)匹配.
我正在使用的正则表达式是: (.*)(#|$)
(.*)= Everything
(#|$)=评论或行尾
代码:
OPTION = re.compile(r'(?P<value>.*)(#|$)')
file = open('file.txt')
lines = file.read()
for line in lines.split('\n'):
get_match = OPTION.match(line)
if get_match:
line_value = get_match.group('value')
print "Match= %s" % line_value
Run Code Online (Sandbox Code Playgroud)
以上工作但不删除评论.如果文件有一行如下:
this is a line # and this is a comment
Run Code Online (Sandbox Code Playgroud)
运行代码时我仍然得到整行.
我是否在正则表达式中缺少其他值/信息,或者我是否需要对代码进行更改?
我已经遇到了一些使用线程模块管理线程的例子(使用Python 2.6).
我想要了解的是这个例子如何调用"run"方法以及在哪里.我什么都看不到.ThreadUrl类在main()函数中实例化为"t",这是我通常期望代码启动"run"方法的地方.
也许这不是使用线程的首选方式?请赐教:
#!/usr/bin/env python
import Queue
import time
import urllib2
import threading
import datetime
hosts = ["http://example.com/", "http://www.google.com"]
queue = Queue.Queue()
class ThreadUrl(threading.Thread):
"""Threaded Url Grab"""
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
def run(self):
while True:
#grabs host from queue
host = self.queue.get()
#grabs urls of hosts and prints first 1024 bytes of page
url = urllib2.urlopen(host)
print url.read(10)
#signals to queue job is done
self.queue.task_done()
start = time.time()
def main():
#spawn a pool of threads, and …Run Code Online (Sandbox Code Playgroud) 我很难尝试将单引号或双引号字符串与Vim的正则表达式引擎匹配.
问题是我将正则表达式赋给变量然后使用它来进行matchlist.
例如,假设我知道我在一行中包含带引号的字符串,我想匹配它:
let regex = '\v"(.*)"'
Run Code Online (Sandbox Code Playgroud)
这样可以匹配任何双引号.同样,这将匹配单引号字符串:
let regex = "\v'(.*)'"
Run Code Online (Sandbox Code Playgroud)
但如果我尝试使用它们,例如:
let regex = '\v['|"](.*)['|"]'
Run Code Online (Sandbox Code Playgroud)
要么
let regex = '\v[\'|\"](.*)[\'|\"]'
Run Code Online (Sandbox Code Playgroud)
然后Vim不知道如何处理它,因为它认为在实际的变量定义中没有关闭一些引号并且它会弄乱正则表达式.
使用正则表达式捕获单引号或双引号字符串的最佳方法是什么?
也许(可能!)我遗漏了一些非常简单的东西,能够使用两个引号而不用担心实际正则表达式的周围引号.
请注意,我更喜欢单引号用于正则表达式,因为这样我不需要使用双反斜杠进行转义.
python ×6
regex ×2
vim ×2
boolean ×1
command-line ×1
control-flow ×1
evaluate ×1
events ×1
exception ×1
function ×1
performance ×1
wsgi ×1
wsgiref ×1