在 SLY 中有一个编写计算器的例子(从calc.py
这里复制):
from sly import Lexer
class CalcLexer(Lexer):
tokens = { NAME, NUMBER }
ignore = ' \t'
literals = { '=', '+', '-', '*', '/', '(', ')' }
# Tokens
NAME = r'[a-zA-Z_][a-zA-Z0-9_]*'
@_(r'\d+')
def NUMBER(self, t):
t.value = int(t.value)
return t
@_(r'\n+')
def newline(self, t):
self.lineno += t.value.count('\n')
def error(self, t):
print("Illegal character '%s'" % t.value[0])
self.index += 1
Run Code Online (Sandbox Code Playgroud)
看起来它被窃听了,因为NAME
和NUMBER
在它们被定义之前就被使用了。但实际上,没有NameError
,并且这段代码执行得很好。这是如何运作的?什么时候可以在定义之前引用名称?
如何就地对字典进行排序?它没有像list.sort
?这样的排序方法。
d = {3: 'three', 1: 'one', 2: 'two'}
tmp = dict(sorted(d.items()))
d.clear()
d.update(tmp)
Run Code Online (Sandbox Code Playgroud)
想要这样的结果 ^ 但应该是正确的就地,即不使用双倍内存。对同一对象的其他引用应该会看到重新排序!