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

有没有一种简单的方法可以在不构建字典的情况下做到这一点?

4

3 回答 3

6

不要伤害自己。使用字典。简单胜于复杂。

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

如果你发现自己想像字典一样使用本地命名空间,99% 的时间你只需要字典。

于 2012-04-26T19:27:44.183 回答
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

它有点工作,尽管只有当你传递它的东西是全局的,或者在全局中有一些看起来像它的东西。由于字符串实习等,它还将返回各种奇怪的匹配项。

于 2012-04-26T19:40:19.437 回答
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']
于 2012-04-26T19:42:48.733 回答