2012-04-26 12 views
0

私は多くの変数を持っており、検証のために設定されている変数の名前を取得する必要があります。例:上記の場合変数の文字列リテラルを取得する方法

studio = 'Warner Brothers' 
movie = '' 
validation = [studio, movie] 

validation_errors = [] 
for item in validation: 
    if not item: 
     validation_errors.append(name of variable) 

、私は結果になりたいと思います:

validation_errors = ['movie'] 

は辞書を構築することなく、これを実行するための簡単な方法はありますか?

+3

(http://nedbatchelder.com/blog/201112/keep_data_out_of_your_variable_names.html [あなたの変数名のうち、データを保管してください] )! – delnan

+1

なぜディクテーションを構築しないのですか?それはずっとすっきりしているだろう。 – FRD

答えて

6

あなた自身を傷つけないでください。辞書を使う。シンプルは複合体より優れています。

validation = {'studio': studio, 'movie': movie} 
validation_errors = [] 
for key in validation: 
    if not validation[key]: 
     validation_errors.append(key) 

辞書のようなローカル名前空間を使いたい場合は、辞書を必要とする時間の99%です。 ませがそれを行う方法の一例として、

0

(または多分それをしない理由のデモンストレーションとして)、このコードを試してみてください。唯一のものであればかかわらず、

def nameof(thing): 
    i = id(thing) 
    names = [n for n in globals().keys() if id(globals()[n]) == i] 
    for name in names: 
     if name[0] != '_': 
      return name, names 
    return names[0], names 

それは一種の作品をあなたはそれをグローバルに渡すか、グローバルに存在するようなものを持っています。また、文字列のインターナショナルなので、すべての種類の奇妙な一致を返します。

0

Pythonがdictをビルドするかどうかは関係ありませんか?

studio = 'Warner Brothers' 
movie = '' 
validation = ['studio', 'movie'] 

validation_errors = [] 
for item in validation: 
    if not locals()[item]: 
     validation_errors.append(item) 

ただし、自分でディクテーションを作成する方が良い考えです。

studio = 'Warner Brothers' 
movie = '' 
validation = dict(studio=studio, movie=movie) 

validation_errors = [] 
for var, value in validation.items(): 
    if not value: 
     validation_errors.append(var) 

そして、あなたはそれから機能を作りたい場合:

def validate(**vars): 
    errors = [] 
    for var, value in vars.items(): 
     if not value: 
      errors.append(var) 
    return errors 

-->studio = 'Warner Brothers' 
-->movie = '' 
-->print validate(studio=studio, movie=movie) 
['movie'] 
関連する問題