如何在使用racket运行脚本时检测给定的命令行参数?也就是说,相当于Python中的sys.argv,Java中的args []等等......
我有一个逻辑函数,如下所示:
doStuff1()
try:
doStuff2()
except type1:
error1()
return endstuff()
except type2:
error2()
return endstuff()
except:
error3()
return endstuff()
if doStuff3():
error4()
return endstuff()
doStuff4()
return endstuff()
Run Code Online (Sandbox Code Playgroud)
如您所见,endstuff()
在函数的每个可能出口处完成.就像现在一样,endstuff()
实际上是2行代码,我最近不得不在所有可能的退出中添加第三行代码.有没有更优雅的方式来组织这个代码?我不能只使用a finally
,因为抛出异常的情况并非总是如此.
我有一个数据库,其列如下:
session | order | atype | amt
--------+-------+-------+-----
1 | 0 | ADD | 10
1 | 1 | ADD | 20
1 | 2 | SET | 35
1 | 3 | ADD | 10
2 | 0 | SET | 30
2 | 1 | ADD | 20
2 | 2 | SET | 55
Run Code Online (Sandbox Code Playgroud)
它代表了正在发生的行动.每个会话从0开始.ADD添加一个数量,而SET设置它.我想要一个函数来返回会话的结束值,例如
SELECT session_val(1); --returns 45
SELECT session_val(2); --returns 55
Run Code Online (Sandbox Code Playgroud)
是否可以编写这样的函数/查询?我不知道如何使用SQL进行任何类似迭代的事情,或者根本不可能.
这就是我正在努力实现的目标。我正在远程调用服务器以获取信息,我想阻止以等待信息。我创建了一个返回 Deferred 的函数,这样当 RPC 带着回复进来时,就会调用 deferred。然后我有一个从线程调用的函数threads.blockingCallFromThread(reactor, deferredfunc, args)
。
如果出现问题——例如,服务器出现故障——那么呼叫将永远不会解除阻塞。在这些情况下,我更喜欢延迟关闭,但有例外。
我部分成功了。我有一个延迟,onConnectionLost
当连接丢失时它会消失。我将阻塞调用函数修改为:
deferred = deferredfunc(args)
self.onConnectionLost.addCallback(lambda _: deferred.errback(
failure.Failure(Exception("connection lost while getting run"))))
result = threads.blockingCallFromThread(
reactor, lambda _: deferred, None)
return result
Run Code Online (Sandbox Code Playgroud)
这工作正常。如果服务器宕机,则连接丢失,并触发 errback。但是,如果服务器没有关闭并且一切正常关闭,onConnectionLost
仍然会被触发,并且这里的匿名回调尝试触发 errback,导致引发AlreadyCalled
异常。
有没有什么巧妙的方法来检查延迟是否已经被解雇?我想避免将它包装在一个try/except
块中,但如果这是唯一的方法,我总是可以求助于它。
我有一个客户端使用twisted连接到服务器.客户端有一个可能在后台执行操作的线程.当反应堆关闭时,我必须:
1) check if the thread is doing things
2) stop it if it is
Run Code Online (Sandbox Code Playgroud)
这是一种优雅的方式吗?我能做的最好的事情是:
def cleanup(self):
isWorkingDF = defer.Deferred()
doneDF = defer.Deferred()
def checkIsWorking():
res = self.stuff.isWorking() #blocking call
reactor.callFromThread(isWorkingDF.callback, res)
def shutdownOrNot(isWorking):
if isWorking:
#shutdown necessary, shutdown is also a blocking call
def shutdown():
self.stuff.shutdown()
reactor.callFromThread(doneDF, None)
reactor.callInThread(shutdown)
else:
doneDF.callback(None) #no shutdown needed
isWorkingDF.addCallback(shutdownOrNot)
reactor.callInThread(checkIsWorking)
return doneDF
Run Code Online (Sandbox Code Playgroud)
首先,我们检查它是否正常工作.该回调的结果rescallback
是关闭或不关闭,然后触发doneDF,扭曲等待直到关闭.
相当混乱呃!有没有更好的办法?
也许一个相关的问题是,是否有更优雅的方式将回调链接到彼此?在完成后我可以看到自己需要做更多的清理代码,所以我必须做出一个不同的done
延迟,并且当前doneDF
激活一个回调,然后执行调用done
延迟的调用.
请考虑以下代码:
df = defer.Deferred()
def hah(_): raise ValueError("4")
df.addCallback(hah)
df.callback(hah)
Run Code Online (Sandbox Code Playgroud)
当它运行时,该异常就会被吃掉.它去了哪里?如何才能显示它?做defer.setDebugging(True)
没有效果.
我问这个是因为其他时候,我得到一个打印输出"延迟时未处理的错误:".在这种情况下如何实现?我看到如果我添加一个errback df
然后errback被异常调用,但我想要做的就是打印错误而不做任何其他事情,我不想手动将该处理程序添加到我创建的每个延迟.
Ruby有延续......它有dynamic-wind
像Scheme这样的结构吗?
我正在连接需要使用机械化登录的页面.它在首页上使用了一些javascript,使得机械化直接更难.我知道我必须提交什么形式才能登录 - 这个形式总是由js生成,每次都是一样的.如何设置机械化只需提交页面上没有的自定义表单?基本上相当于这个perl问题,但在Python中.
我正在尝试SendMessage
将键盘输入发送到另一个窗口.我知道缺点,但我必须这样做,因为我必须发送几个键,我不能保证窗口将有焦点 - 所以当窗口没有焦点时这必须工作.
我正在通过尝试将密钥发送到记事本窗口来测试它.我尝试了以下变化,但没有一个有效:
def post_keys1(hwnd):
win32api.SendMessage(
hwnd, win32con.WM_KEYDOWN, ord('A'),
0 + (0 << 8) + (ord('A') << 16) + (0 << 24))
win32api.SendMessage(
hwnd, win32con.WM_CHAR, ord('A'),
0 + (0 << 8) + (ord('A') << 16) + (0 << 24))
win32api.SendMessage(
hwnd, win32con.WM_KEYUP, ord('A'),
0 + (0 << 8) + (ord('A') << 16) + (0xC0 << 24))
def post_keys2(hwnd):
win32api.PostMessage(
hwnd, win32con.WM_KEYDOWN, ord('A'),
0 + (0 << 8) + (ord('A') << 16) + (0 << 24))
win32api.PostMessage(
hwnd, …
Run Code Online (Sandbox Code Playgroud) python ×5
twisted ×3
deferred ×2
arguments ×1
c ×1
coding-style ×1
command-line ×1
forms ×1
input ×1
javascript ×1
mechanize ×1
postgresql ×1
pywin32 ×1
racket ×1
ruby ×1
scheme ×1
shutdown ×1
sql ×1
stack ×1
winapi ×1