Как исправить eval()() eval в Python3

#python-3.x

#python-3.x

Вопрос:

Это код из GraphWave:

 width_basis = 15
nbTrials = 20

### 1. Choose the basis (cycle, torus or chain)
basis_type = "cycle" 

### 2. Add the shapes 
n_shapes = 5  ## numbers of shapes to add 
#shape=["fan",6] ## shapes and their associated required parameters  (nb of edges for the star, etc)
#shape=["star",6]
list_shapes = [["house"]] * n_shapes

### 3. Give a name to the graph
identifier = 'AA'  ## just a name to distinguish between different trials
name_graph = 'houses'  identifier
sb.set_style('white')
add_edges = 0
G, communities, _ , role_id = build_graph.build_structure(width_basis, basis_type, list_shapes, start=0,
                                       add_random_edges=add_edges, plot=True,
                                       savefig=False)
  

функция build_structure:

 def build_structure(width_basis, basis_type, list_shapes, start=0,
                    rdm_basis_plugins=False, add_random_edges=0,
                    plot=False, savefig=False):
    basis, role_id = eval(basis_type)(start, width_basis)
  

ошибка при eval()():
имя ‘cycle’ не определено.

Когда я вижу исходный код, функция eval — это eval() . Что означает eval()() и как исправить эту ошибку?

Комментарии:

1. eval(basis_type) предполагается, что он возвращает вызываемый объект. Затем вызывается результат eval() .

2. Вместо этого код должен использовать globals()[basis_type] , или, что еще лучше, поместить все возможные типы в словарь; basis_types = {} , со строковыми ключами, указывающими на вызываемые объекты.

3. Ошибка вычисления означает только то, что в пространстве имен, где eval() выполняется, имя cycle не определено.

Ответ №1:

Я решил ту же проблему с той же библиотекой:

Прежде всего, обратите внимание, что библиотека поддерживает python 2.7, а не 3.x, как ваши теги.

Я изменил код для поддержки python 3.5, а также иерархию файлов проекта, и это сработало для меня.

Кроме того, для лучшей практики я удалил часть «eval» и вместо этого использовал dictionary, как предложил @Martijn Pieters в комментариях.