2011-10-10 4 views
29

나는 현재 1 학년생 인 파이썬을 가르치고 있으며, 내 학생 중 일부가 사용하기로 결정한 (겉으로보기에는 무해한) input 함수가 뒤에있는 eval에 대한 호출을 숨기고 있다는 것을 알면 놀랐다. 그것.raw_input을 통해 파이썬의 입력을 사용하는 것이 유용할까요?

그래서 제 질문은, 왜 input 함수 호출 eval는이 이제까지는 raw_input와 함께 할 안전하지 않다고 유용 무엇을 것 않습니다입니까? 필자는 이것이 파이썬 3에서 변경되었다는 것을 이해하지만, 처음에는 특별한 디자인 결정처럼 보입니다.

Python 2.x input function documentation

+7

코드 골프에 유용합니다 –

+0

"이유"에 대답하려면 - 파이썬의 첫 번째 REPL은 'while 1 : print input()'되었을 수도 있습니다. 나는 그 고대 시대에 훌륭한 프로그래밍 방법을 지원하는 것이 파이썬의 우선 순위 목록에서 그랬던 것처럼 그렇게 높지는 않았다. 파이썬 3의'while True : print (eval (input)))'은 혼란스럽게 보일지도 모릅니다. –

답변

34

이 이상 파이썬 2의 입력을 사용하는 지금까지 유용한가요 raw_input?

번호


input() 사용자가 제공하는 코드를 평가한다. Python의 모든 기능을 사용자에게 제공합니다. 생성자 표현식 /리스트 포함, __import__if/else 연산자를 사용하면 말 그대로 파이썬에서 수행 할 수있는 모든 작업을 단일 표현식으로 수행 할 수 있습니다. 악의적 인 사용자는 input()을 사용하여 파일 (__import__('os').remove('precious_file'))을 제거하고 프로그램의 나머지 부분을 monkeypatch (setattr(__import__('__main__'), 'function', lambda:42)) ... 할 수 있습니다.

일반 사용자는 모든 고급 기능을 사용할 필요가 없습니다. 표현이 필요하지 않은 경우 ast.literal_eval(raw_input())을 사용하십시오. literal_eval 함수는 안전합니다.

고급 사용자 용으로 작성하는 경우 코드를 입력하는 더 좋은 방법을 제공하십시오. 플러그인, 사용자 모듈 등 - 기능 만이 아닌 완전한 파이썬 구문을 사용한 것.

자신이하는 일을 확실히 알고 있다면 eval(raw_input())라고 말하십시오. eval은 "나는 위험합니다!"라고 외칩니다. 훈련 된 눈에. 그러나 확률은 당신이 이것을 필요로하지 않을 것입니다.


input()

파이썬 3가 해결되어 기존의 디자인 실수 중 하나였다.

+0

이것은 내가 생각한 것입니다. 당신은'input'의 기능을 원했고,'eval (raw_input()) '했다면 적어도 위험하다는 것을 알았을 것입니다. 그리고 달리 사용해야하는 좋은 이유가 없습니다. 감사! – luketparkinson

4

input 꽤 많은 대화 형 파이썬 쉘을위한 빌딩 블록으로 만 유용하다. 당신은 틀림없이 그것이 일하는 방식과 똑같이 작동한다는 것이 놀랍고 내장형이 되기에는 목적에 맞지 않습니다. 제가 생각하기에 그것은 파이썬 3에서 제거 된 것입니다.

7

파이썬 입력 함수는 표현을 평가하는 결과는 입니다. raw_input이 함수는 문자열을 그 실행의

name = "Arthur" 
age = 45 

first = raw_input("Please enter your age ") 
second = input("Please enter your age again ") 

# first will always contain a string 

# second could contain any object and you can even 
# type in a calculation and use "name" and "age" as 
# you enter it at run time ... 

print "You said you are",first 
print "Then you said you are",second 

예를 리턴

실시 예 1 실시 예

Prompt$ python yraw 
Please enter your age 45 
Please enter your age again 45 
You said you are 45 Then you said you are 45 

2

Prompt$ python yraw 
Please enter your age 45 + 7 
Please enter your age again 45 + 7 
You said you are 45 + 7 Then you said you are 52 
Prompt$ 

Q. 이유 입력을 수행 함수 호출 eval? 파이썬 2.X에서 raw_input을 비교하여 사용자가 입력에 표현 '45 + 7 '을 입력 시나리오를 고려

A.는 입력이 올바른 결과를 줄 것이다

+1

양자 택일로 그들은'quit()'를 입력 할 수 있습니다. 이것은 당신이 코드의 핵심 부분을 통과 할 때 다소 위험합니다 ... – tobyodavies

+8

아니면'__import __ ('os'). remove ('precious_file')'을 입력 할 수 있습니다. 오히려 위험한 곳 어디에서든지. ['ast.literal_eval (raw_input())'] (http://docs.python.org/library/ast.html#ast.literal_eval)은 거의 모든 상황에서 훨씬 더 나은 선택입니다. [Python 3의 input()] (http://docs.python.org/py3k/library/functions.html#input)은 2의 raw_input()과 유사합니다. –

+7

이 답변에 동의하지 않습니다. 입력이 52 일 때 "올바른 결과"라고 생각하는 이유는 무엇입니까? 올바른 결과가 "숫자를 입력하십시오."라고 생각합니다. 사용자가 줄 수있는 파이썬 표현의 결과를 계산하기 위해 숫자를 요구하는 프로그램에 대한 좋은 이유는 없습니다. 이런 불합리한 행동뿐만 아니라 Petr이 지적한 심각한 보안 위험도 있습니다. 질문은 "유용하다"이고 대답은 "아니오"입니다. – mgiuca

1

raw_input이 더 좋습니다. 변경 사항없이 항상 사용자 입력을 반환합니다. 반대로 input() 함수는 입력 한 내용을 파이썬 코드처럼 변환하려고 시도하며 보안 문제가있어 피할 수 있어야합니다.

실제 프로그램에서는 input()을 사용하지 마십시오. 입력을 파이썬 코드로 평가하지 않고 원하는 특정 입력 형식을 처리하는 것으로 구문 분석하십시오.

관련 문제