2014-11-06 3 views
-3

Я написал несколько классов, которые я хотел бы протестировать, создав несколько экземпляров моих классов. Я хотел бы, чтобы эти экземпляры имеют имена по образцу p1, p2 и т.д.:Динамически определять имена переменных

p1 = Point(1,1) 
p2 = Point(2,2) 
p3 = Point(3,3) 

Есть ли способ сделать это быстро для многих переменных? Что-то вроде этого:

for i in range(1,1000): 
    *magic goes here* 
isinstance(p500, Point) # True 
+3

[Не делайте этого] (HTTP: // nedbatchelder .com/blog/201112/keep_data_out_of_your_variable_names.html), либо используйте список или словарь. –

ответ

1

Вы можете изменить текущую область меняющегося globals()

Например:

globals()['p234'] = Point(1, 2) 
print p234 

Это, однако, крайне низкое качество подход: трудно понять, поддержать, создает ужасный область охвата и медленная (хотя это, вероятно, не имеет значения). Используйте надлежащий контейнер данных, я хотел бы предложить список:

points = [Point(i, i) for i in xrange(500)] 
assert isinstance(p[-1], Point) 

Таким образом, вы можете сделать Assert на каждом объекте, как:

points = [Point(i, i) for i in xrange(500)] 
for point in points: 
    assert isinstance(point, Point) 
+1

Для простого случая, подобного этому, я бы не рекомендовал использовать malling с 'globals()' или 'locals()'. Просто используйте список. – Kevin

+2

Но если вы это сделаете, вы используете пространство имен переменных, как будто оно само является переменной. Это обычно приводит к сожалениям позже. – RemcoGerlich

+0

Возможно, это правильный ответ на мой реальный вопрос, однако лучший способ сделать то, что я пытаюсь сделать, - это, вероятно, использовать список, предложенный RemcGerlich. –

1

вы можете хранить их в качестве ключей в словаре

vars_dict = {} 
for i in range(1,1000): 
    vars_dict['p{}'.format(i)] = Point(i, i) 
isinstance(vars_dict['p500'], Point) # True 

или итератора, как @RemcoGerlich сделал

+0

Я полагаю, что это может быть проще. –

6

Это называется список:

p = [Point(1, 1), Point(2, 2), Point(3, 3)] 

Теперь p[0] является вашим p1, и так далее.

p = [Point(i, i) for i in range(1, 1000)] 
isinstance(p[500], Point) # True