Я хотел бы вывести выражение ввода пользователя в строку.Как преобразовать выражение Python в строку
Причина в том, что входное выражение определено пользователем. Я хочу вывести результат выражения, и распечатать заявление, которое приведет к этому результату.
import sys
import shutil
expression1 = sys.path
expression2 = shutil.which
def get_expression_str(expression):
if callable(expression):
return expression.__module__ +'.'+ expression.__name__
else:
raise TypeError('Could not convert expression to string')
#print(get_expression_str(expression1))
# returns : builtins.TypeError: Could not convert expression to string
#print(get_expression_str(expression2))
# returns : shutil.which
#print(str(expression1))
#results in a list like ['/home/bernard/clones/it-should-work/unit_test', ... ,'/usr/lib/python3/dist-packages']
#print(repr(expression1))
#results in a list like ['/home/bernard/clones/it-should-work/unit_test', ... ,'/usr/lib/python3/dist-packages']
Я посмотрел в Python инспектировать модуля, но даже
inspect.iscode(sys.path)
возвращает Ложные
Для тех, кто задается вопросом, почему это реверс строки разобраны на выражение с использованием functools.partial см parse statement string
Фон.
Программа должна работать. Должно, но это не всегда так. Потому что программе нужны конкретные ресурсы, ОС, версия ОС, другие пакеты, файлы и т. Д. Каждая программа нуждается в разных требованиях (ресурсах) для правильной работы. Какие конкретные требования не могут быть предсказаны. Система знает, какие ресурсы имеются и недоступны. Поэтому вместо ручной проверки всех настроек и конфигураций позвольте программе справки сделать это за вас.
Таким образом, пользователь или разработчик программы задает свои требования вместе с утверждениями о том, как получить эту информацию: выражения. Который может быть выполнен с использованием eval. Мог. Как упоминалось в StackOverflow eval, это зло. Использование eval трудно сделать безопасным с помощью черного списка, см.: http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html Использование нескольких советов SO Я использую namedtuple со строкой для сравнения с пользовательской строкой ввода и функцией.
Белый список лучше, чем черный список. Только если строка синтаксического анализа соответствует «bare_expression», тогда возвращается выражение. Этот белый список содержит дополнительную информацию, как обрабатывать f.e. «unit_of_measurement». Это объясняет, почему и почему, но это необходимо. Список namedtuples гораздо больше, чем просто белого списка и определяется:
Expr_UOfM = collections.namedtuple('Expr_UOfM', ['bare_expression', 'keylist', 'function', 'unit_of_measurement', 'attrlist'])
namedtuple, которые соответствуют (очень ограниченный) список:
Exp_list = [Expr_UOfM('sys.path', '' , sys.path, un.STR, []),
Expr_UOfM('shutil.which', '', shutil.which, None, [])]
Этот список может быть очень длинным и контент имеет решающее значение для дальнейшей правильной обработки. Обратите внимание, что первое и третье поля очень похожи. Должна быть единая точка отсчета, но для меня это в этот момент невозможно. Обратите внимание на строку: 'sys.path' равно (часть) ввода пользователя, а выражение: sys.path является частью списка namedtuple. Хорошее разделение, ограничивающее возможное злоупотребление. Если строка и выражение не на 100% идентичны, может возникнуть странное поведение, которое очень сложно отлаживать. Поэтому он хочет, чтобы функция get_expression_str проверяла идентичность первого и третьего полей. Просто для полной надежности программы .
Я использую Python 3.4
try 'str (выражение)' – SomethingSomething
Я сделал это, посмотрю линию 4e снизу, но безуспешно. – Bernard
Итак, где вход пользователя? Вы не начинаете * со строкой (например, 'sys.path'')? – jonrsharpe