Команда exec () работает в простом коде, но не в методе - PullRequest
0 голосов
/ 08 июля 2019

Может ли кто-нибудь объяснить мне, почему exec () прекрасно работает при вызове вне метода, но внутри метода возникает следующая ошибка?

UnboundLocalError: local variable 'connectivities' referenced before assignment

Это пример кода:

#!/usr/bin/env python

CON_FILE = "sample_input.txt"


import re
AAIG_connectivities_dict = {}
with open(CON_FILE, 'r') as f:
    for line in f:
        m = re.search("^([A-Za-z0-9]+N[DE12X]*H[DE12X]*)\s+(\(.*)$", line)
        if m:
            i_AAIG_name = m.group(1)
            s = "connectivities = " + m.group(2) + ","  ; # comma to support the single connectivities, too.
            exec(s)
            connectivities = list(connectivities)
            AAIG_connectivities_dict[i_AAIG_name] = connectivities
print(AAIG_connectivities_dict)


def load_connectivities_from_file(CON_FILE):
    import re
    AAIG_connectivities_dict = {}
    with open(CON_FILE, 'r') as f:
        for line in f:
            m = re.search("^([A-Za-z0-9]+N[DE12X]*H[DE12X]*)\s+(\(.*)$", line)
            if m:
                i_AAIG_name = m.group(1)
                s = "connectivities = " + m.group(2) + ","  ; # comma to support the single connectivities, too.
                exec(s)
                connectivities = list(connectivities)
                AAIG_connectivities_dict[i_AAIG_name] = connectivities
    print(AAIG_connectivities_dict)

load_connectivities_from_file(CON_FILE)

Чтобы создать «sample_input.txt», выполните в оболочке BASH:

cat > sample_input.txt << EOF
i    possible i-1
X10NXHX    ('X8NXHX', 2, 3, 1.0, 0.29096014803723164), ('X15NXHX', 1, 3, 0.5075369033220299, 0.017894454516959042), ('X62NXHX', 1, 3, 0.2811455233433974, 0.009912472860959547), ('X9NXHX', 1, 3, 0.12840435222669283, 0.004527209402233843), ('X29NXHX', 1, 3, 0.10270495431102347, 0.003621114290518612), ('X13NXHX', 1, 3, 0.08843022425103912, 0.0031178237787778664), ('X27NXHX', 1, 3, 0.06967097761433207, 0.0024564206699284994), ('X61NXHX', 1, 3, 0.05203985561001743, 0.001834792353398024)
X12NXHX    ('X11NXHX', 1, 4, 1.0, 0.014683671473740228), ('X32NXHX', 1, 4, 0.4498988189862975, 0.006606166454418515), ('X31NXHX', 1, 4, 0.1633848174540025, 0.0023990889832915907), ('X36NXHX', 1, 4, 0.08439509702204087, 0.0012392298786660803), ('X13NXHX', 1, 4, 0.049958867050537537, 0.0007335795909703586), ('X30NXHX', 1, 4, 0.02502771889502097, 0.00036749880199160877), ('X38NXHX', 1, 4, 0.02304040021466484, 0.00033831766737563233), ('X40NXHX', 1, 4, 0.01903733838008644, 0.00027953802250761526), ('X29NXHX', 1, 4, 0.01757512963793901, 0.00025806742971189146), ('X5NXHX', 1, 4, 0.01709261655271193, 0.0002509823660866362), ('X39NXHX', 1, 4, 0.007533665145110988, 0.00011062186398397724), ('X33NXHX', 1, 4, 0.005975869974827519, 8.774771148015558e-05), ('X41NXHX', 1, 4, 0.00046841775328956294, 6.878092401771443e-06), ('X55NXHX', 1, 4, 0.00035046651402599333, 5.146135154504658e-06), ('X35NXHX', 1, 4, 8.313139742956269e-05, 1.2206741290086314e-06)
EOF

1 Ответ

0 голосов
/ 08 июля 2019

Я нашел решение. В Python 3 вы должны использовать новое пустое пространство имен в exec (). Поэтому код должен выглядеть следующим образом:

#!/usr/bin/env python

CON_FILE = "sample_input.txt"


import re
AAIG_connectivities_dict = {}
with open(CON_FILE, 'r') as f:
    for line in f:
        m = re.search("^([A-Za-z0-9]+N[DE12X]*H[DE12X]*)\s+(\(.*)$", line)
        if m:
            i_AAIG_name = m.group(1)
            s = "connectivities = " + m.group(2) + ","  ; # comma to support the single connectivities, too.
            exec(s)
            connectivities = list(connectivities)
            AAIG_connectivities_dict[i_AAIG_name] = connectivities
print(AAIG_connectivities_dict)


def load_connectivities_from_file(CON_FILE):
    import re
    AAIG_connectivities_dict = {}
    with open(CON_FILE, 'r') as f:
        for line in f:
            m = re.search("^([A-Za-z0-9]+N[DE12X]*H[DE12X]*)\s+(\(.*)$", line)
            if m:
                i_AAIG_name = m.group(1)
                s = "connectivities = " + m.group(2) + ","  ; # comma to support the single connectivities, too.
                namespace = {}
                exec(s, namespace)
                connectivities = list(namespace['connectivities'])
                AAIG_connectivities_dict[i_AAIG_name] = connectivities
    print(AAIG_connectivities_dict)

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