Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
400cbc3a
Commit
400cbc3a
authored
Feb 28, 2006
by
Tim Peters
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Set EOL style to native.
parent
85b1052e
Changes
5
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
969 additions
and
969 deletions
+969
-969
Demo/parser/unparse.py
Demo/parser/unparse.py
+158
-158
Lib/test/contextmanager.py
Lib/test/contextmanager.py
+33
-33
Lib/test/nested.py
Lib/test/nested.py
+40
-40
Lib/test/test_ast.py
Lib/test/test_ast.py
+178
-178
Lib/test/test_with.py
Lib/test/test_with.py
+560
-560
No files found.
Demo/parser/unparse.py
View file @
400cbc3a
"Usage: unparse.py <path to source file>"
import
sys
class
Unparser
:
"""Methods in this class recursively traverse an AST and
output source code for the abstract syntax; original formatting
is disregarged. """
def
__init__
(
self
,
tree
,
file
=
sys
.
stdout
):
"""Unparser(tree, file=sys.stdout) -> None.
Print the source for tree to file."""
self
.
f
=
file
self
.
_indent
=
0
self
.
dispatch
(
tree
)
self
.
f
.
flush
()
def
fill
(
self
,
text
=
""
):
"Indent a piece of text, according to the current indentation level"
self
.
f
.
write
(
"
\
n
"
+
" "
*
self
.
_indent
+
text
)
def
write
(
self
,
text
):
"Append a piece of text to the current line."
self
.
f
.
write
(
text
)
def
enter
(
self
):
"Print ':', and increase the indentation."
self
.
write
(
":"
)
self
.
_indent
+=
1
def
leave
(
self
):
"Decrease the indentation level."
self
.
_indent
-=
1
def
dispatch
(
self
,
tree
):
"Dispatcher function, dispatching tree type T to method _T."
if
isinstance
(
tree
,
list
):
for
t
in
tree
:
self
.
dispatch
(
t
)
return
meth
=
getattr
(
self
,
"_"
+
tree
.
__class__
.
__name__
)
meth
(
tree
)
############### Unparsing methods ######################
# There should be one method per concrete grammar type #
# Constructors should be grouped by sum type. Ideally, #
# this would follow the order in the grammar, but #
# currently doesn't. #
########################################################
def
_Module
(
self
,
tree
):
for
stmt
in
tree
.
body
:
self
.
dispatch
(
stmt
)
# stmt
def
_Expr
(
self
,
tree
):
self
.
fill
()
self
.
dispatch
(
tree
.
value
)
def
_Import
(
self
,
t
):
self
.
fill
(
"import "
)
first
=
True
for
a
in
t
.
names
:
if
first
:
first
=
False
else
:
self
.
write
(
", "
)
self
.
write
(
a
.
name
)
if
a
.
asname
:
self
.
write
(
" as "
+
a
.
asname
)
def
_Assign
(
self
,
t
):
self
.
fill
()
for
target
in
t
.
targets
:
self
.
dispatch
(
target
)
self
.
write
(
" = "
)
self
.
dispatch
(
t
.
value
)
def
_ClassDef
(
self
,
t
):
self
.
write
(
"
\
n
"
)
self
.
fill
(
"class "
+
t
.
name
)
if
t
.
bases
:
self
.
write
(
"("
)
for
a
in
t
.
bases
:
self
.
dispatch
(
a
)
self
.
write
(
", "
)
self
.
write
(
")"
)
self
.
enter
()
self
.
dispatch
(
t
.
body
)
self
.
leave
()
def
_FunctionDef
(
self
,
t
):
self
.
write
(
"
\
n
"
)
self
.
fill
(
"def "
+
t
.
name
+
"("
)
self
.
dispatch
(
t
.
args
)
self
.
enter
()
self
.
dispatch
(
t
.
body
)
self
.
leave
()
def
_If
(
self
,
t
):
self
.
fill
(
"if "
)
self
.
dispatch
(
t
.
test
)
self
.
enter
()
# XXX elif?
self
.
dispatch
(
t
.
body
)
self
.
leave
()
if
t
.
orelse
:
self
.
fill
(
"else"
)
self
.
enter
()
self
.
dispatch
(
t
.
orelse
)
self
.
leave
()
# expr
def
_Str
(
self
,
tree
):
self
.
write
(
repr
(
tree
.
s
))
def
_Name
(
self
,
t
):
self
.
write
(
t
.
id
)
def
_List
(
self
,
t
):
self
.
write
(
"["
)
for
e
in
t
.
elts
:
self
.
dispatch
(
e
)
self
.
write
(
", "
)
self
.
write
(
"]"
)
unop
=
{
"Invert"
:
"~"
,
"Not"
:
"not"
,
"UAdd"
:
"+"
,
"USub"
:
"-"
}
def
_UnaryOp
(
self
,
t
):
self
.
write
(
self
.
unop
[
t
.
op
.
__class__
.
__name__
])
self
.
write
(
"("
)
self
.
dispatch
(
t
.
operand
)
self
.
write
(
")"
)
# others
def
_arguments
(
self
,
t
):
first
=
True
# XXX t.defaults
for
a
in
t
.
args
:
if
first
:
first
=
False
else
:
self
.
write
(
", "
)
self
.
dispatch
(
a
)
if
t
.
vararg
:
if
first
:
first
=
False
else
:
self
.
write
(
", "
)
self
.
write
(
"*"
+
t
.
vararg
)
if
t
.
kwarg
:
if
first
:
first
=
False
else
:
self
.
write
(
", "
)
self
.
write
(
"**"
+
self
.
kwarg
)
self
.
write
(
")"
)
def
roundtrip
(
filename
):
source
=
open
(
filename
).
read
()
tree
=
compile
(
source
,
filename
,
"exec"
,
0x400
)
Unparser
(
tree
)
if
__name__
==
'__main__'
:
roundtrip
(
sys
.
argv
[
1
])
"Usage: unparse.py <path to source file>"
import
sys
class
Unparser
:
"""Methods in this class recursively traverse an AST and
output source code for the abstract syntax; original formatting
is disregarged. """
def
__init__
(
self
,
tree
,
file
=
sys
.
stdout
):
"""Unparser(tree, file=sys.stdout) -> None.
Print the source for tree to file."""
self
.
f
=
file
self
.
_indent
=
0
self
.
dispatch
(
tree
)
self
.
f
.
flush
()
def
fill
(
self
,
text
=
""
):
"Indent a piece of text, according to the current indentation level"
self
.
f
.
write
(
"
\
n
"
+
" "
*
self
.
_indent
+
text
)
def
write
(
self
,
text
):
"Append a piece of text to the current line."
self
.
f
.
write
(
text
)
def
enter
(
self
):
"Print ':', and increase the indentation."
self
.
write
(
":"
)
self
.
_indent
+=
1
def
leave
(
self
):
"Decrease the indentation level."
self
.
_indent
-=
1
def
dispatch
(
self
,
tree
):
"Dispatcher function, dispatching tree type T to method _T."
if
isinstance
(
tree
,
list
):
for
t
in
tree
:
self
.
dispatch
(
t
)
return
meth
=
getattr
(
self
,
"_"
+
tree
.
__class__
.
__name__
)
meth
(
tree
)
############### Unparsing methods ######################
# There should be one method per concrete grammar type #
# Constructors should be grouped by sum type. Ideally, #
# this would follow the order in the grammar, but #
# currently doesn't. #
########################################################
def
_Module
(
self
,
tree
):
for
stmt
in
tree
.
body
:
self
.
dispatch
(
stmt
)
# stmt
def
_Expr
(
self
,
tree
):
self
.
fill
()
self
.
dispatch
(
tree
.
value
)
def
_Import
(
self
,
t
):
self
.
fill
(
"import "
)
first
=
True
for
a
in
t
.
names
:
if
first
:
first
=
False
else
:
self
.
write
(
", "
)
self
.
write
(
a
.
name
)
if
a
.
asname
:
self
.
write
(
" as "
+
a
.
asname
)
def
_Assign
(
self
,
t
):
self
.
fill
()
for
target
in
t
.
targets
:
self
.
dispatch
(
target
)
self
.
write
(
" = "
)
self
.
dispatch
(
t
.
value
)
def
_ClassDef
(
self
,
t
):
self
.
write
(
"
\
n
"
)
self
.
fill
(
"class "
+
t
.
name
)
if
t
.
bases
:
self
.
write
(
"("
)
for
a
in
t
.
bases
:
self
.
dispatch
(
a
)
self
.
write
(
", "
)
self
.
write
(
")"
)
self
.
enter
()
self
.
dispatch
(
t
.
body
)
self
.
leave
()
def
_FunctionDef
(
self
,
t
):
self
.
write
(
"
\
n
"
)
self
.
fill
(
"def "
+
t
.
name
+
"("
)
self
.
dispatch
(
t
.
args
)
self
.
enter
()
self
.
dispatch
(
t
.
body
)
self
.
leave
()
def
_If
(
self
,
t
):
self
.
fill
(
"if "
)
self
.
dispatch
(
t
.
test
)
self
.
enter
()
# XXX elif?
self
.
dispatch
(
t
.
body
)
self
.
leave
()
if
t
.
orelse
:
self
.
fill
(
"else"
)
self
.
enter
()
self
.
dispatch
(
t
.
orelse
)
self
.
leave
()
# expr
def
_Str
(
self
,
tree
):
self
.
write
(
repr
(
tree
.
s
))
def
_Name
(
self
,
t
):
self
.
write
(
t
.
id
)
def
_List
(
self
,
t
):
self
.
write
(
"["
)
for
e
in
t
.
elts
:
self
.
dispatch
(
e
)
self
.
write
(
", "
)
self
.
write
(
"]"
)
unop
=
{
"Invert"
:
"~"
,
"Not"
:
"not"
,
"UAdd"
:
"+"
,
"USub"
:
"-"
}
def
_UnaryOp
(
self
,
t
):
self
.
write
(
self
.
unop
[
t
.
op
.
__class__
.
__name__
])
self
.
write
(
"("
)
self
.
dispatch
(
t
.
operand
)
self
.
write
(
")"
)
# others
def
_arguments
(
self
,
t
):
first
=
True
# XXX t.defaults
for
a
in
t
.
args
:
if
first
:
first
=
False
else
:
self
.
write
(
", "
)
self
.
dispatch
(
a
)
if
t
.
vararg
:
if
first
:
first
=
False
else
:
self
.
write
(
", "
)
self
.
write
(
"*"
+
t
.
vararg
)
if
t
.
kwarg
:
if
first
:
first
=
False
else
:
self
.
write
(
", "
)
self
.
write
(
"**"
+
self
.
kwarg
)
self
.
write
(
")"
)
def
roundtrip
(
filename
):
source
=
open
(
filename
).
read
()
tree
=
compile
(
source
,
filename
,
"exec"
,
0x400
)
Unparser
(
tree
)
if
__name__
==
'__main__'
:
roundtrip
(
sys
.
argv
[
1
])
Lib/test/contextmanager.py
View file @
400cbc3a
class
GeneratorContextManager
(
object
):
def
__init__
(
self
,
gen
):
self
.
gen
=
gen
def
__context__
(
self
):
return
self
def
__enter__
(
self
):
try
:
return
self
.
gen
.
next
()
except
StopIteration
:
raise
RuntimeError
(
"generator didn't yield"
)
def
__exit__
(
self
,
type
,
value
,
traceback
):
if
type
is
None
:
try
:
self
.
gen
.
next
()
except
StopIteration
:
return
else
:
raise
RuntimeError
(
"generator didn't stop"
)
else
:
try
:
self
.
gen
.
throw
(
type
,
value
,
traceback
)
except
(
type
,
StopIteration
):
return
else
:
raise
RuntimeError
(
"generator caught exception"
)
def
contextmanager
(
func
):
def
helper
(
*
args
,
**
kwds
):
return
GeneratorContextManager
(
func
(
*
args
,
**
kwds
))
return
helper
class
GeneratorContextManager
(
object
):
def
__init__
(
self
,
gen
):
self
.
gen
=
gen
def
__context__
(
self
):
return
self
def
__enter__
(
self
):
try
:
return
self
.
gen
.
next
()
except
StopIteration
:
raise
RuntimeError
(
"generator didn't yield"
)
def
__exit__
(
self
,
type
,
value
,
traceback
):
if
type
is
None
:
try
:
self
.
gen
.
next
()
except
StopIteration
:
return
else
:
raise
RuntimeError
(
"generator didn't stop"
)
else
:
try
:
self
.
gen
.
throw
(
type
,
value
,
traceback
)
except
(
type
,
StopIteration
):
return
else
:
raise
RuntimeError
(
"generator caught exception"
)
def
contextmanager
(
func
):
def
helper
(
*
args
,
**
kwds
):
return
GeneratorContextManager
(
func
(
*
args
,
**
kwds
))
return
helper
Lib/test/nested.py
View file @
400cbc3a
import
sys
from
collections
import
deque
class
nested
(
object
):
def
__init__
(
self
,
*
contexts
):
self
.
contexts
=
contexts
self
.
entered
=
None
def
__context__
(
self
):
return
self
def
__enter__
(
self
):
if
self
.
entered
is
not
None
:
raise
RuntimeError
(
"Context is not reentrant"
)
self
.
entered
=
deque
()
vars
=
[]
try
:
for
context
in
self
.
contexts
:
mgr
=
context
.
__context__
()
vars
.
append
(
mgr
.
__enter__
())
self
.
entered
.
appendleft
(
mgr
)
except
:
self
.
__exit__
(
*
sys
.
exc_info
())
raise
return
vars
def
__exit__
(
self
,
*
exc_info
):
# Behave like nested with statements
# first in, last out
# New exceptions override old ones
ex
=
exc_info
for
mgr
in
self
.
entered
:
try
:
mgr
.
__exit__
(
*
ex
)
except
:
ex
=
sys
.
exc_info
()
self
.
entered
=
None
if
ex
is
not
exc_info
:
raise
ex
[
0
],
ex
[
1
],
ex
[
2
]
import
sys
from
collections
import
deque
class
nested
(
object
):
def
__init__
(
self
,
*
contexts
):
self
.
contexts
=
contexts
self
.
entered
=
None
def
__context__
(
self
):
return
self
def
__enter__
(
self
):
if
self
.
entered
is
not
None
:
raise
RuntimeError
(
"Context is not reentrant"
)
self
.
entered
=
deque
()
vars
=
[]
try
:
for
context
in
self
.
contexts
:
mgr
=
context
.
__context__
()
vars
.
append
(
mgr
.
__enter__
())
self
.
entered
.
appendleft
(
mgr
)
except
:
self
.
__exit__
(
*
sys
.
exc_info
())
raise
return
vars
def
__exit__
(
self
,
*
exc_info
):
# Behave like nested with statements
# first in, last out
# New exceptions override old ones
ex
=
exc_info
for
mgr
in
self
.
entered
:
try
:
mgr
.
__exit__
(
*
ex
)
except
:
ex
=
sys
.
exc_info
()
self
.
entered
=
None
if
ex
is
not
exc_info
:
raise
ex
[
0
],
ex
[
1
],
ex
[
2
]
Lib/test/test_ast.py
View file @
400cbc3a
This diff is collapsed.
Click to expand it.
Lib/test/test_with.py
View file @
400cbc3a
This diff is collapsed.
Click to expand it.
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