我想生成看起来像这样的代码行:
search.condition1(ape).condition2(monkey).condition3(gorilla)
这是用于在诸如以下的结构中使用它:
jungle(search.condition1(ape).condition2(monkey).condition3(gorilla))
问题是,我只希望将已设置的条件(至少将始终设置一个条件)包括在字符串中。我是通过用户input
设置的。因此,假设我已经收到:
cond1 =
cond2 = giraffe
cond3 = zebra
在这种情况下,代码行应为:
search.condition2(giraffe).condition3(zebra)
即,完全排除condition1
。
我已经尝试过此解决方案:
searchstring = "search."
if len(cond1) > 1:
searchstring += "condition1(cond1)
else: pass
if len(cond2) > 1:
searchstring += ".condition(cond2)"
else: pass
if len(cond3) > 1:
searchstring += ".condition(cond3)"
else:pass
这通过字符串附加正确地编译了我想要的东西,但是显然是[string
。
所以,当我写...
jungle(searchstring)
...可以说,它无法实现与原始代码相同的功能。它不可执行。
是否有解决方案的想法或更好的做法?
您不想构造代码。您想根据需要修改查询集。
例如:
conditions = ['foo', 'bar', 'baz']
query = search
for term in conditions:
query = query.condition(term)
jungle(query)
相当于search.condition('foo').condition('bar')...
。您正在对前一个.condition()
的返回值调用condition()
方法,并将最终结果用作jungle()
的参数。
let
cond1 = ''
cond2 = 'giraffe'
cond3 = 'zebra'
然后创建字符串命令
string_command = 'jungle(search.{})'.format('.'.join(['condition{}({})'.format(str(i+1), cond) for i, cond in enumerate([cond1, cond2, cond3]) if cond]))
将是
'jungle(search.condition2(giraffe).condition3(zebra))'
然后评估命令
eval(string_command)