2012-04-26 4 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'] 

Есть простой способ сделать это без создания Dict?

+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 строит для вас диктофон?

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']