Python 有几个内置函数和魔法字典,可以让我检查具有任意名称的变量的值。locals()['foo']产生名为 的局部变量的值foo;globals()['foo']产生全局范围内该名称的值。如果我有一个类实例x,我可以查看x.__dict__实例变量的值。
我似乎找不到任何方法来利用Python的LEGB名称评估机制来查找“最接近”范围内任意命名的变量的值。
def foo(cmd: str, b: str, c=None, d=None, e=None):
req_x = {'c', 'd'}
req_y = {'c', 'e'}
if cmd == 'x':
data = {name: locals()[name] for name in req_x}
elif cmd == 'y':
data = {name: locals()[name] for name in req_y if locals()[name] in b}
Run Code Online (Sandbox Code Playgroud)
这是行不通的,因为locals()在理解范围内是该理解的范围。中的变量foo,包括参数,都在封闭范围内;不是本地的,不是全局的,不是内置的。Python本身可以搜索封闭的范围;b第二种理解中的引用是合法且明确定义的。
根据 LEGB 搜索规则,我将使用什么代替来locals()[name]获取具有该名称的变量的值?
(“捕获理解之外的值locals()并引用理解内的副本”是一个有用的解决方法,但这不是我问题的答案。)
我不完全确定为什么会发生这种情况,但我猜想这是因为您的查询被硬编码为用作:name参数名称,这与 SQLAlchemy 选择的参数名称不同。您可以使用以下bindparam结构覆盖参数名称:
@classmethod
def get_by_name(cls, name):
sql = '''
SELECT first_name, last_name FROM dbo.[user] WHERE username = :username
'''
obj = DBSession.query(cls).from_statement(text(sql)).params(
username=name.encode()).first()
return obj
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |