Python 中的裸词/新关键字
Bare words / new keywords in Python
我想看看是否可以定义新的关键字,或者,正如在 WAT's Destroy All Software talk 中讨论 Ruby 时所说的那样,在 Python 中定义裸词。
我想出了一个在其他地方找不到的答案,所以我决定在 Whosebug 上分享它的问答风格。
到目前为止,我只在任何块之外的 REPL 中尝试过这个。也可以让它在其他地方工作。
我把它放在我的 python 启动文件中:
def bareWordHandler(type_, value, traceback_):
if isinstance(value, SyntaxError):
import traceback
# You can probably modify this next line so that it'll work within blocks, as well as outside them:
bareWords = traceback.format_exception(type_, value, traceback_)[1].split()
# At this point we have the raw string that was entered.
# Use whatever logic you want on it to decide what to do.
if bareWords[0] == 'Awesome':
print(' '.join(bareWords[1:]).upper() + '!')
return
bareWordsHandler.originalExceptHookFunction(type_, value, traceback_)
import sys
bareWordsHandler.originalExceptHookFunction = sys.excepthook
sys.excepthook = bareWordsHandler
快速REPL会话演示后记:
>>> Awesome bare words
BARE WORDS!
负责任地使用。
编辑:这是一个更有用的例子。我添加了一个 run
关键字。
if bareWords[0] == 'from' and bareWords[2] == 'run':
atPrompt.autoRun = ['from ' + bareWords[1] + ' import ' + bareWords[3].split('(')[0],
' '.join(bareWords[3:])]
return
atPrompt.autoRun
是一个变量列表,当我的提示显示时,会自动检查并反馈。因此,例如,我可以这样做:
>>> from loadBalanceTester run loadBalancerTest(runJar = False)
这被解释为:
from loadBalancerTest import loadBalancerTest
loadBalancerTest(runJar = False)
它有点像宏 - 我想做这种事情很常见,所以我决定添加一个关键字,让我用更少的击键来完成。
我想看看是否可以定义新的关键字,或者,正如在 WAT's Destroy All Software talk 中讨论 Ruby 时所说的那样,在 Python 中定义裸词。
我想出了一个在其他地方找不到的答案,所以我决定在 Whosebug 上分享它的问答风格。
到目前为止,我只在任何块之外的 REPL 中尝试过这个。也可以让它在其他地方工作。
我把它放在我的 python 启动文件中:
def bareWordHandler(type_, value, traceback_):
if isinstance(value, SyntaxError):
import traceback
# You can probably modify this next line so that it'll work within blocks, as well as outside them:
bareWords = traceback.format_exception(type_, value, traceback_)[1].split()
# At this point we have the raw string that was entered.
# Use whatever logic you want on it to decide what to do.
if bareWords[0] == 'Awesome':
print(' '.join(bareWords[1:]).upper() + '!')
return
bareWordsHandler.originalExceptHookFunction(type_, value, traceback_)
import sys
bareWordsHandler.originalExceptHookFunction = sys.excepthook
sys.excepthook = bareWordsHandler
快速REPL会话演示后记:
>>> Awesome bare words
BARE WORDS!
负责任地使用。
编辑:这是一个更有用的例子。我添加了一个 run
关键字。
if bareWords[0] == 'from' and bareWords[2] == 'run':
atPrompt.autoRun = ['from ' + bareWords[1] + ' import ' + bareWords[3].split('(')[0],
' '.join(bareWords[3:])]
return
atPrompt.autoRun
是一个变量列表,当我的提示显示时,会自动检查并反馈。因此,例如,我可以这样做:
>>> from loadBalanceTester run loadBalancerTest(runJar = False)
这被解释为:
from loadBalancerTest import loadBalancerTest
loadBalancerTest(runJar = False)
它有点像宏 - 我想做这种事情很常见,所以我决定添加一个关键字,让我用更少的击键来完成。