私は次のような状況にいます:
- 関数の内容は、評価される前に文字列で動的に作成されます。
- ユーザーが文字列コンテンツの一部を変更できるため、コンテンツを構成するために使用
if test: dosomething else: dosomethingElse
したくありません。また、条件ステートメントの数式間のスペースを管理する必要もありません。
そのため、次のリスト ヒントを使用します: [dosomethingElse, dosomething][ test ]
, (テストに対する True/False 回答で dosomething/dosomethingElse が得られます)。
ソリューションは正しく機能しますが、テスト チェックの前にdosomething と dosomethingElseの両方が評価されます。1 つだけを評価することに関心があります。(私は厳しい時間的制約の状況にあります)。
1行で1つの関数だけを評価する方法はありますか?
ここでは、コードの主な手順を示します。「依存関係」はここにリストされていますが、元のプログラムでは適切に管理されています。
一意の fun_id を作成する
def gen_id(): s = 10000 while s: yield s s += 1 fun_ticket = gen_id()
楽しい説明 (名前、引数、式、ID)
from collections import defaultdict d= defaultdict(lambda :defaultdict()) d["dosomething"]["args"] = set(["argA","argB"]) d["dosomething"]["exp"] = "return argA + argB" d["dosomething"]["id"] = "f_%d"%(fun_ticket.next()) d["dosomethingElse"]["args"] = set(["argX","argY","argZ"]) d["dosomethingElse"]["exp"] = "return argX + argY+ argZ" d["dosomethingElse"]["id"] = "f_%d"%(fun_ticket.next()) d["doChoice"]["args"] = set(["argE","argF"]) d["doChoice"]["exp"] = "return [dosomethingElse, dosomething][argE > 0] + argF" d["doChoice"]["id"] = "f_%d"%(fun_ticket.next())
評価するdoChoice関数を用意します。
dependencies = ('dosomething', 'dosomethingElse', 'doChoice') Allargs = set().union(*[d[x]["args"] for x in dependencies]) funChoice = 'def %s(%s): %s'%(d['doChoice']['id'],",".join(Allargs),d['doChoice']["exp"])
結果: funChoice 文字列は次のとおりです。
def f_10002(argX,argY,argZ,argA,argB,argE,argF): return [f_10001(argX,argY,argZ), f_10000(argA,argB)][argE > 0] + argF
ここに問題があります: funChoice 評価 eval doSomething AND doSomethingElse . if else (および文字列のスペース管理の問題) を使用せずに 1 つだけを評価する方法はありますか?