#python #macos #eval #textwrangler
#python #macos #оценка #textwrangler
Вопрос:
По какой-то причине мой скрипт отказывается запускаться непосредственно из Text Wrangler, но отлично работает при импорте в терминал.
import math
def main():
print("This program find the real solutions to a quadraticn")
a,b,c, = eval(input("Please enter the coefficients (a,b,c): "))
discRoot = math.sqrt(b * b -4 * a * c)
root1 = (-b discRoot) / (2 * a)
root2 = (-b - discRoot) / (2 * a)
print("nThe solutions are:" , root1, root2)
main()
Когда я запускаю это в textwrangler, я получаю сообщение об ошибке «TypeError: eval() аргумент 1 должен быть строкой или объектом кода». Разве смысл использования eval() не подразумевает, что следующий ввод является целым числом, а не строкой? Почему это происходит?
Комментарии:
1. почему вы используете eval?
2. Я только начинаю изучать python, поэтому я следую инструкциям книги.
3. вы должны установить ipython для python 2.7 и 3.4. Есть много интересных расширений, которые вы можете использовать.
Ответ №1:
В Python 2 input()
эквивалентно eval(input())
в Python 3. Я думаю, что в терминале вы запускаете его с помощью Python 3, но TextWrangler использует Python 2, поэтому выполняет TextWrangle, eval(eval(input()))
который вычисляется как eval(5)
, что вызывает ошибку, которую вы видите.
Чтобы исправить это, вам необходимо обновить TextWrangler или использовать Python 2 в терминале. Если вам нужен второй вариант, вам следует заменить eval(input())
на input()
.
Примечание сбоку — использовать eval
подобное — плохая идея (это опасно). Вероятно, вам следует сделать что-то вроде a, b, c = map(int, input().split(","))
(в Python 3) вместо этого.
Комментарии:
1. Да, я использую 3.4.1 в терминале. Должен ли я добавить строку Shebang в свой скрипт, чтобы исправить это, или есть способ заставить TextWrangler работать с Python 3.4?
2. Я бы предположил, что есть способ заставить TextWrangler работать с Python 3.4 (большинство приличных текстовых редакторов должны уметь), но я не знаю, что это такое.
3. Функция map отлично сработала, большое вам спасибо. Вы говорили, что eval опасен, если мой ввод представляет собой кортеж? Это нормально, если это всего лишь одно значение, верно?
4. Нет. При
eval
оценке любого полученного кода кто-то может ввести что-то вроде__import__("subprocess").Popen("delete all the files on the computer")
, и это будет выполнено. Помимо этого, это просто плохой стиль.
Ответ №2:
Проблема не в eval
. Проблема заключается в input
том, что он пытается прочитать из sys.stdin
стандартного входного потока.
Если вы хотите обойти это, вам следует передать аргумент в eval
в качестве аргумента вместо использования input
.