Рекурсивно вызвать значение переменной в eval - PullRequest
0 голосов
/ 16 марта 2012

На самом деле у меня есть два dict "d" и "d1", где dict "d" содержит несколько групп, а dict "d1" содержит формулы.

d = {
 'a;0': {'2010': 'A;B', 'p': '', 'r': ''},
 'a;1': {'2010': '1;',  'p': '', 'r': ''},
 'a;2': {'2010': '7;8', 'p': '', 'r': ''},
 'b;0': {'2010': 'C;D', 'p': '', 'r': ''},
 'b;1': {'2010': '5;6', 'p': '', 'r': ''}
}

Здесь a;0 содержит теги вполе 2010 (то есть A, B) и b;0 - это еще одна группа с тегами (C, D), a;1, a;2 - это подгруппы a;0, содержащие значение в поле 2010 ('1', '') и ('7', '8') аналогично b;1 является подгруппой в b;0, содержащей значения ('5', '6').

d1 = {
  'F':{'p':'','r':'','2010':'A+B'},
  'G':{'p':'','r':'','2010':'F+A'}
}

Это формула dict, где F='A+B и G=F+A, когда я пытаюсь запустить это с кодом ниже, он печатает только F значение, а не G значение.Код, который я использовал:

tag=[]
d2={}
for k,v in d.items():
    if ';' in k: # i am checking in main dict is their any subgroups
        a=k.split(';')
if a[1]=='0': # i am splitting it and checking if list zero bcoz main groups contain 0 ie('a;0','b;0') 
        pass
else:
        tag=d[a[0]+';0']['2010'].split(";")#splitting main group into tags
        value=v['2010'].split(";") #contain values 
        c=[0 if value[i]=='' else value[i] for i in range(len(value))]# if any balnk value in list values make it zero.bcoz i should use it eval
        for i in range(len(c)): #converting to int 
            try:
                c[i]=int(c[i])
            except ValueError:
                c[i]=str(c[i])
        x=dict(zip(tag,c)) # making a dict of tag n values for each iteration
        print '<%s>'%a[0] #printing group name
        for i in range(len(value)):
            if value[i]=='':
                tag[i]=''
            else:
                print '<%s>%s<%s>'%(tag[i],value[i],tag[i])
        for k,v in d1.items():
            try:
                d2[k]={'p':'','r':'','2010':eval(d1[k]['2010'],x)} #trying to use eval
            except NameError:
                continue
        print '</%s>'%a[0] 

Из этого его печать в группе, но значение 'G' не вычисляется

Вывод из этого

<a>
<A>7</A>
<B>8</A>
<F>15</F>
</a>
<a>
<A>1</A>
<F>1</F>
</a>
<b>
<C>5</C>
<D>6</D>
</b>

Ночто я хочу получить в выводе:

<a>
<A>7</A>
<B>8</A>
<F>15</F>
<G>22</G>
</a>
<a>
<A>1</A>
<F>1</F>
</a>
<b>
<C>5</C>
<D>6</D>
</b>

я хочу, чтобы значение 'G' было напечатано в группе

Пожалуйста, кто-нибудь, помогите мне, заранее спасибо

1 Ответ

2 голосов
/ 16 марта 2012

Ваш код действительно не легко читать. Посмотрев его на полчаса, я все еще не могу понять, что он делает. Несколько общих указателей:

  • Читать и применять PEP8 .
  • Используйте более описательные имена. Лучшее имя, которое у вас есть, это «значение», которое на самом деле кажется кортежем значений. Также избегайте повторного использования одних и тех же имен в разных местах, особенно в циклах. У вас есть такие вложенные циклы, которые просто напрашиваются на неприятности.
  • Рассмотрение возможности рефакторинга вашего кода в функции, которые делают определенные вещи. И назовите их соответствующим образом.
  • Добавить хорошие комментарии объясняя, что вы делаете.

Если вы сделаете все это, вы, вероятно, найдете ошибку самостоятельно, но если нет, то отправьте сообщение с более читабельным кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...