变量中的全局字典名称

时间:2019-07-05 10:51:49

标签: python python-3.x

我想在init.py中添加更多字典,并在变量中设置其名称。但是它不会检测到它的名字。

我的程序:

from StackOverflow import *

number = input("Wich car do you want:")
car = r"Car"+number
print(car["Color"])
print(car["Brand"])

StackOverflow \ __ init __。py:

Car1 = {
    "Color": "Bleu",
    "Brand": "Aston Martin"
}

Car2 = {
    "Color": "Red",
    "Brand": "Volvo"
}

我希望它能提供所选汽车的颜色和品牌。 但是我得到这个错误:

Traceback (most recent call last):
  File "D:/Users/stanw/Documents/Projecten/Stani Bot/Programma's/StackOverflow/Choose Car.py", line 5, in <module>
    print(car["Color"])
TypeError: string indices must be integers

3 个答案:

答案 0 :(得分:2)

从Python 3.7开始,您可以在模块上使用getattr

import StackOverflow

number = input('Enter a number')
var_name = f'Car{number}'
if hasattr(StackOverflow, var_name):
    car = getattr(StackOverflow, var_name)
else:
    print('Car not found')

答案 1 :(得分:1)

具有全局变量的

方法仅在变量位于当前模块中时才有效。要在另一个模块中获取值,可以使用getattr:

import other
print getattr(other, "name_of_variable")
  

getattr(对象,名称[,默认])

     

返回对象的命名属性的值。名称必须是   串。如果字符串是对象属性之一的名称,   结果是该属性的值。例如,getattr(x,   'foobar')等同于x.foobar。如果named属性没有   存在,如果提供则返回默认值,否则AttributeError为   提出。

类似:

import StackOverflow
number = input("Wich car do you want:")
car = r"Car"+number
print (getattr(StackOverflow, car))

关于各种“ eval”解决方案的说明:您应谨慎使用eval,特别是如果要评估的字符串来自可能不受信任的来源-否则,您最终可能会删除磁盘或磁盘的全部内容如果您收到了恶意字符串,就会出现类似的情况。

答案 2 :(得分:-1)

尝试更改:

car = r"Car"+number

收件人:

car = globals()["Car" + number]

或:

car = eval("Car"+number)