Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
d8ac4d1d
Unverified
Kaydet (Commit)
d8ac4d1d
authored
Ock 04, 2018
tarafından
Serhiy Storchaka
Kaydeden (comit)
GitHub
Ock 04, 2018
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
bpo-31778: Make ast.literal_eval() more strict. (#4035)
Addition and subtraction of arbitrary numbers no longer allowed.
üst
fbb490fd
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
55 additions
and
24 deletions
+55
-24
ast.py
Lib/ast.py
+21
-15
test_ast.py
Lib/test/test_ast.py
+31
-8
test_inspect.py
Lib/test/test_inspect.py
+1
-1
2017-10-18-17-29-30.bpo-31778.B6vAkP.rst
...S.d/next/Library/2017-10-18-17-29-30.bpo-31778.B6vAkP.rst
+2
-0
No files found.
Lib/ast.py
Dosyayı görüntüle @
d8ac4d1d
...
@@ -35,8 +35,6 @@ def parse(source, filename='<unknown>', mode='exec'):
...
@@ -35,8 +35,6 @@ def parse(source, filename='<unknown>', mode='exec'):
return
compile
(
source
,
filename
,
mode
,
PyCF_ONLY_AST
)
return
compile
(
source
,
filename
,
mode
,
PyCF_ONLY_AST
)
_NUM_TYPES
=
(
int
,
float
,
complex
)
def
literal_eval
(
node_or_string
):
def
literal_eval
(
node_or_string
):
"""
"""
Safely evaluate an expression node or a string containing a Python
Safely evaluate an expression node or a string containing a Python
...
@@ -48,6 +46,21 @@ def literal_eval(node_or_string):
...
@@ -48,6 +46,21 @@ def literal_eval(node_or_string):
node_or_string
=
parse
(
node_or_string
,
mode
=
'eval'
)
node_or_string
=
parse
(
node_or_string
,
mode
=
'eval'
)
if
isinstance
(
node_or_string
,
Expression
):
if
isinstance
(
node_or_string
,
Expression
):
node_or_string
=
node_or_string
.
body
node_or_string
=
node_or_string
.
body
def
_convert_num
(
node
):
if
isinstance
(
node
,
Constant
):
if
isinstance
(
node
.
value
,
(
int
,
float
,
complex
)):
return
node
.
value
elif
isinstance
(
node
,
Num
):
return
node
.
n
raise
ValueError
(
'malformed node or string: '
+
repr
(
node
))
def
_convert_signed_num
(
node
):
if
isinstance
(
node
,
UnaryOp
)
and
isinstance
(
node
.
op
,
(
UAdd
,
USub
)):
operand
=
_convert_num
(
node
.
operand
)
if
isinstance
(
node
.
op
,
UAdd
):
return
+
operand
else
:
return
-
operand
return
_convert_num
(
node
)
def
_convert
(
node
):
def
_convert
(
node
):
if
isinstance
(
node
,
Constant
):
if
isinstance
(
node
,
Constant
):
return
node
.
value
return
node
.
value
...
@@ -62,26 +75,19 @@ def literal_eval(node_or_string):
...
@@ -62,26 +75,19 @@ def literal_eval(node_or_string):
elif
isinstance
(
node
,
Set
):
elif
isinstance
(
node
,
Set
):
return
set
(
map
(
_convert
,
node
.
elts
))
return
set
(
map
(
_convert
,
node
.
elts
))
elif
isinstance
(
node
,
Dict
):
elif
isinstance
(
node
,
Dict
):
return
dict
(
(
_convert
(
k
),
_convert
(
v
))
for
k
,
v
return
dict
(
zip
(
map
(
_convert
,
node
.
keys
),
in
zip
(
node
.
keys
,
node
.
values
))
map
(
_convert
,
node
.
values
)
))
elif
isinstance
(
node
,
NameConstant
):
elif
isinstance
(
node
,
NameConstant
):
return
node
.
value
return
node
.
value
elif
isinstance
(
node
,
UnaryOp
)
and
isinstance
(
node
.
op
,
(
UAdd
,
USub
)):
operand
=
_convert
(
node
.
operand
)
if
isinstance
(
operand
,
_NUM_TYPES
):
if
isinstance
(
node
.
op
,
UAdd
):
return
+
operand
else
:
return
-
operand
elif
isinstance
(
node
,
BinOp
)
and
isinstance
(
node
.
op
,
(
Add
,
Sub
)):
elif
isinstance
(
node
,
BinOp
)
and
isinstance
(
node
.
op
,
(
Add
,
Sub
)):
left
=
_convert
(
node
.
left
)
left
=
_convert
_signed_num
(
node
.
left
)
right
=
_convert
(
node
.
right
)
right
=
_convert
_num
(
node
.
right
)
if
isinstance
(
left
,
_NUM_TYPES
)
and
isinstance
(
right
,
_NUM_TYPES
):
if
isinstance
(
left
,
(
int
,
float
))
and
isinstance
(
right
,
complex
):
if
isinstance
(
node
.
op
,
Add
):
if
isinstance
(
node
.
op
,
Add
):
return
left
+
right
return
left
+
right
else
:
else
:
return
left
-
right
return
left
-
right
r
aise
ValueError
(
'malformed node or string: '
+
repr
(
node
)
)
r
eturn
_convert_signed_num
(
node
)
return
_convert
(
node_or_string
)
return
_convert
(
node_or_string
)
...
...
Lib/test/test_ast.py
Dosyayı görüntüle @
d8ac4d1d
...
@@ -551,14 +551,37 @@ class ASTHelpers_Test(unittest.TestCase):
...
@@ -551,14 +551,37 @@ class ASTHelpers_Test(unittest.TestCase):
self
.
assertEqual
(
ast
.
literal_eval
(
'{1, 2, 3}'
),
{
1
,
2
,
3
})
self
.
assertEqual
(
ast
.
literal_eval
(
'{1, 2, 3}'
),
{
1
,
2
,
3
})
self
.
assertEqual
(
ast
.
literal_eval
(
'b"hi"'
),
b
"hi"
)
self
.
assertEqual
(
ast
.
literal_eval
(
'b"hi"'
),
b
"hi"
)
self
.
assertRaises
(
ValueError
,
ast
.
literal_eval
,
'foo()'
)
self
.
assertRaises
(
ValueError
,
ast
.
literal_eval
,
'foo()'
)
self
.
assertEqual
(
ast
.
literal_eval
(
'6'
),
6
)
self
.
assertEqual
(
ast
.
literal_eval
(
'+6'
),
6
)
self
.
assertEqual
(
ast
.
literal_eval
(
'-6'
),
-
6
)
self
.
assertEqual
(
ast
.
literal_eval
(
'-6'
),
-
6
)
self
.
assertEqual
(
ast
.
literal_eval
(
'-6j+3'
),
3
-
6
j
)
self
.
assertEqual
(
ast
.
literal_eval
(
'3.25'
),
3.25
)
self
.
assertEqual
(
ast
.
literal_eval
(
'3.25'
),
3.25
)
self
.
assertEqual
(
ast
.
literal_eval
(
'+3.25'
),
3.25
)
def
test_literal_eval_issue4907
(
self
):
self
.
assertEqual
(
ast
.
literal_eval
(
'-3.25'
),
-
3.25
)
self
.
assertEqual
(
ast
.
literal_eval
(
'2j'
),
2
j
)
self
.
assertEqual
(
repr
(
ast
.
literal_eval
(
'-0.0'
)),
'-0.0'
)
self
.
assertEqual
(
ast
.
literal_eval
(
'10 + 2j'
),
10
+
2
j
)
self
.
assertRaises
(
ValueError
,
ast
.
literal_eval
,
'++6'
)
self
.
assertEqual
(
ast
.
literal_eval
(
'1.5 - 2j'
),
1.5
-
2
j
)
self
.
assertRaises
(
ValueError
,
ast
.
literal_eval
,
'+True'
)
self
.
assertRaises
(
ValueError
,
ast
.
literal_eval
,
'2+3'
)
def
test_literal_eval_complex
(
self
):
# Issue #4907
self
.
assertEqual
(
ast
.
literal_eval
(
'6j'
),
6
j
)
self
.
assertEqual
(
ast
.
literal_eval
(
'-6j'
),
-
6
j
)
self
.
assertEqual
(
ast
.
literal_eval
(
'6.75j'
),
6.75
j
)
self
.
assertEqual
(
ast
.
literal_eval
(
'-6.75j'
),
-
6.75
j
)
self
.
assertEqual
(
ast
.
literal_eval
(
'3+6j'
),
3
+
6
j
)
self
.
assertEqual
(
ast
.
literal_eval
(
'-3+6j'
),
-
3
+
6
j
)
self
.
assertEqual
(
ast
.
literal_eval
(
'3-6j'
),
3
-
6
j
)
self
.
assertEqual
(
ast
.
literal_eval
(
'-3-6j'
),
-
3
-
6
j
)
self
.
assertEqual
(
ast
.
literal_eval
(
'3.25+6.75j'
),
3.25
+
6.75
j
)
self
.
assertEqual
(
ast
.
literal_eval
(
'-3.25+6.75j'
),
-
3.25
+
6.75
j
)
self
.
assertEqual
(
ast
.
literal_eval
(
'3.25-6.75j'
),
3.25
-
6.75
j
)
self
.
assertEqual
(
ast
.
literal_eval
(
'-3.25-6.75j'
),
-
3.25
-
6.75
j
)
self
.
assertEqual
(
ast
.
literal_eval
(
'(3+6j)'
),
3
+
6
j
)
self
.
assertRaises
(
ValueError
,
ast
.
literal_eval
,
'-6j+3'
)
self
.
assertRaises
(
ValueError
,
ast
.
literal_eval
,
'-6j+3j'
)
self
.
assertRaises
(
ValueError
,
ast
.
literal_eval
,
'3+-6j'
)
self
.
assertRaises
(
ValueError
,
ast
.
literal_eval
,
'3+(0+6j)'
)
self
.
assertRaises
(
ValueError
,
ast
.
literal_eval
,
'-(3+6j)'
)
def
test_bad_integer
(
self
):
def
test_bad_integer
(
self
):
# issue13436: Bad error message with invalid numeric values
# issue13436: Bad error message with invalid numeric values
...
@@ -1077,11 +1100,11 @@ class ConstantTests(unittest.TestCase):
...
@@ -1077,11 +1100,11 @@ class ConstantTests(unittest.TestCase):
ast
.
copy_location
(
new_left
,
binop
.
left
)
ast
.
copy_location
(
new_left
,
binop
.
left
)
binop
.
left
=
new_left
binop
.
left
=
new_left
new_right
=
ast
.
Constant
(
value
=
20
)
new_right
=
ast
.
Constant
(
value
=
20
j
)
ast
.
copy_location
(
new_right
,
binop
.
right
)
ast
.
copy_location
(
new_right
,
binop
.
right
)
binop
.
right
=
new_right
binop
.
right
=
new_right
self
.
assertEqual
(
ast
.
literal_eval
(
binop
),
30
)
self
.
assertEqual
(
ast
.
literal_eval
(
binop
),
10
+
20
j
)
def
main
():
def
main
():
...
...
Lib/test/test_inspect.py
Dosyayı görüntüle @
d8ac4d1d
...
@@ -2074,7 +2074,7 @@ class TestSignatureObject(unittest.TestCase):
...
@@ -2074,7 +2074,7 @@ class TestSignatureObject(unittest.TestCase):
self
.
assertEqual
(
p
(
'f'
),
False
)
self
.
assertEqual
(
p
(
'f'
),
False
)
self
.
assertEqual
(
p
(
'local'
),
3
)
self
.
assertEqual
(
p
(
'local'
),
3
)
self
.
assertEqual
(
p
(
'sys'
),
sys
.
maxsize
)
self
.
assertEqual
(
p
(
'sys'
),
sys
.
maxsize
)
self
.
assert
Equal
(
p
(
'exp'
),
sys
.
maxsize
-
1
)
self
.
assert
NotIn
(
'exp'
,
signature
.
parameters
)
test_callable
(
object
)
test_callable
(
object
)
...
...
Misc/NEWS.d/next/Library/2017-10-18-17-29-30.bpo-31778.B6vAkP.rst
0 → 100644
Dosyayı görüntüle @
d8ac4d1d
ast.literal_eval() is now more strict. Addition and subtraction of
arbitrary numbers no longer allowed.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment