3

私は次のような状況にいます:

  1. 関数の内容は、評価される前に文字列で動的に作成されます。
  2. ユーザーが文字列コンテンツの一部を変更できるため、コンテンツを構成するために使用if test: dosomething else: dosomethingElseしたくありません。また、条件ステートメントの数式間のスペースを管理する必要もありません。

そのため、次のリスト ヒントを使用します: [dosomethingElse, dosomething][ test ], (テストに対する True/False 回答で dosomething/dosomethingElse が得られます)。

ソリューションは正しく機能しますが、テスト チェックの前にdosomething と dosomethingElseの両方が評価されます。1 つだけを評価することに関心があります。(私は厳しい時間的制約の状況にあります)。

1行で1つの関数だけを評価する方法はありますか?

ここでは、コードの主な手順を示します。「依存関係」はここにリストされていますが、元のプログラムでは適切に管理されています。

  1. 一意の fun_id を作成する

    def gen_id():
        s = 10000
        while s:
            yield s
            s += 1
    
    fun_ticket = gen_id()
    
  2. 楽しい説明 (名前、引数、式、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())
    
  3. 評価する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"])
    
  4. 結果: 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 つだけを評価する方法はありますか?

4

1 に答える 1

2

条件式を使用します:

dosomething if test else dosomethingelse

の結果に応じて、 とdosomethingの1 つだけが評価されます。ドキュメントの引用:dosomethingelsetest

この式x if C else yは、最初に条件C ( x ではありません) を評価します。Cが true の場合、x評価され、その値が返されます。それ以外の場合、yが評価され、その値が返されます。

これをあなたのコードに適応させる:

d["doChoice"]["exp"] = "return (dosomething if argE > 0 else dosomethingElse) + argF"
于 2013-08-08T09:20:36.890 に答える