2016-04-01 9 views
1

Python3のPHPにfunction_existsのようなものがありますか?以下のために、function_exists for PHP python3

["_and", ["_tautology"], ["tautology"]] 

とPythonの文の中にそれを回すしたい:私は次のように(一部のWeb UIを介して)ユーザーが(いくつかの奇妙なlispのような構造で)JSONでの簡単なルールを定義することができます何かを実装していますただ、好奇心の外に

_and(_tautology(), _tautology()) 

にその元JSONルールを回すことによって、インスタンス、これらの機能

import operator 
from functools import reduce 

def _and(*args): 
    return lambda context: reduce(operator.and, [arg(context) for arg in args], True) 

def _tautology(*_): 
    return lambda *__: True 

は、タスクのこの種のために作られたastのですか?私は以前これをやっていましたが、私はスケーラブルなものを探しています。

mapping = {'_and': _and} 

に追随し、リストが成長し続けると、より多くのコードでの結果ではなく、それらを実装するので、文字列値が何を意味するのかを説明するために入力されたことでしょう。同様に、これは事実上の辞書を維持した前に私がやったので、それとも別のルールエンジンを使用したはずですか?ルールの一つが

["_and", ["_equals", "fieldA", "some_value"], 
     ["_equals", "fieldB", "some_other_value"]] 

_equalsを想定すると、次のようになりますので、ルールが

_and(_equals('fieldA', 'some_value'), 
    _equals('fieldB', 'some_other_value')) 

TLに展開されるように

def _equals(field_name, value): 
    return lambda context: context[field_name] == value 

であり、DR

メイン質問:はPython3のためにfunction_existsのようなものがありますが、これにはが適していますか? セカンダリ質問:代わりに何らかの種類のルールエンジンを使用する必要がありますか?

重複質問レポートについていいえ、変数が存在するかどうかは確認していません。文字列値と同じ名前の関数があるかどうかを知りたい。たとえば、文字列が'_and'の場合、_andという名前の関数があるかどうかを知りたいのですが、この識別子が実際に関数であるかどうかを調べようとはしません。

+5

http://stackoverflow.com/questions/843277/how-do-i-check-if-a-variable-exists-in-python – Morton

+0

この種のタスクでは、自動的に関数を登録するデコレータを作成する必要があります名前に基づくマッピングに変換します。人生を楽にします。 –

+0

http://stackoverflow.com/questions/9390126/pythonic-way-to-check-if-something-existsを使用して「foobarが定義されていますか」を確認します。 "foobar"は関数なのかどうかを判断するにはhttp://stackoverflow.com/a/18704793/1191425を参照してください。 –

答えて

2

Mortonは、globals()locals()を使用して、名前を含む文字列を使用して変数をフェッチすることができます。

In [32]: a = 1 

In [33]: def b(): 
    c = 2 
    print(globals()['a']) 
    print(globals()['b']) 
    print(locals()['c']) 
    ....:  

In [34]: b() 
1 
<function b at 0x7f425cae3ae8> 
2 

でも!あなたの仕事のために、あなたの関数を自動的にマッピングに登録するデコレータの使用をお勧めします。

_mapping = {} 


def register(f): 
    _mapping[f.__name__] = f 
    return f 


@register 
def _and(*args): 
    return lambda context: reduce(operator.and_, 
            [arg(context) for arg in args], True) 

@register 
def _tautology(*_): 
    return lambda *_: True 

ので、あなたのfunction_existsはちょうど

_mapping[key] 

ASTは、解析されたPythonのソースから生成された構文木を検査する既存の構文木を変更し、異なる言語からのpythonに新しいものとtranspilingを生成するのに適しているだろうそれから構文木を生成することによって(いくつかの用途を挙げるために)したがって、はいの場合、JSONからASTを生成してコンパイルすることができます。私はそれが実際にはHyのものだと信じていますが、JSONからではありませんが、完全な吹き出し構文です。

+0

Oooo、今私は理解している – Jeffrey04