После запуска функции функция стала ndarray - PullRequest
0 голосов
/ 16 декабря 2018

Я пытаюсь написать код с функцией exec и eval для чтения списков переменных из файла numpy .npz.

См. Предыдущий пост: С помощью Михаэля Бучера имя exec "templet_1h"не определено , функция сейчас работает.Однако я столкнулся с еще одной неловкой ситуацией.

До того, как я выполняю функцию, тип (read_file) был функцией, после того, как я извиняюсь, тип функции (read_file) стал классом "numpy.ndarry".

Может кто-нибудь помочь мне объяснить это немного?Как это решить?

def read_file(file_names_2):
    global templet_1h
    import numpy as np
    Delete_elements=["arr_0"]
    evaluate_1= "templet_1h=np.load(\"./" +file_names_2+ ".npz\")";
    exec(evaluate_1,globals())
    for i in (templet_1h.files):
        if not ( (i in Delete_elements) ):
            evaluate_2= i+"="+"templet_1h[\"" + i + "\"]";
            exec(evaluate_2,globals())
    del templet_1h
    return 

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Единственное возможное объяснение этого поведения заключается в том, что у вас есть файл с именем read_file, который добавляется к templet_1h.

Когда вы перебираете templet_1h.files, в какой-то момент происходит следующееsaid:

evaluate_2= i+"="+"templet_1h[\"" + i + "\"]";
# this results in: read_file = templet_1h["read_file"]

Когда это выполнено, он связывает read_file с пустым массивом в глобальном пространстве имен вместо вашей функции.


Хотя есть способы исправить этопроблема, проблема real заключается в том, что вы не должны использовать exec таким образом.Выполнять произвольный код Python опасно, и этот конкретный фрагмент очень прост для злоупотребления .Например, если пользователь решает создать имя файла 'np.argmax', вы теряете возможность вызывать функцию argmax, список можно продолжать и продолжать.

Вы действительно должны использовать что-то вроде словаря для храненияпеременное число переменных, а не полагаться на опасное поведение.

0 голосов
/ 16 декабря 2018

a numpy.ndarray - это тип класса, созданный numpy для целей вычислений с использованием numpy функций

Чтобы преобразовать один из наиболее используемых list:

import numpy as np

x = np.ndarray([1,2])
x = x.tolist()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...