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
7be19aab
Kaydet (Commit)
7be19aab
authored
Haz 07, 2008
tarafından
Georg Brandl
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
Factor out docstring dedenting from inspect.getdoc() into inspect.cleandoc()
to ease standalone use of the algorithm.
üst
6a5a177c
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
125 additions
and
100 deletions
+125
-100
_ast.rst
Doc/library/_ast.rst
+0
-85
inspect.rst
Doc/library/inspect.rst
+10
-5
language.rst
Doc/library/language.rst
+1
-1
inspect.py
Lib/inspect.py
+7
-0
test_ast.py
Lib/test/test_ast.py
+100
-9
test_inspect.py
Lib/test/test_inspect.py
+4
-0
NEWS
Misc/NEWS
+3
-0
No files found.
Doc/library/_ast.rst
deleted
100644 → 0
Dosyayı görüntüle @
6a5a177c
.. _ast:
Abstract Syntax Trees
=====================
.. module:: _ast
:synopsis: Abstract Syntax Tree classes.
.. sectionauthor:: Martin v. Löwis <martin@v.loewis.de>
.. versionadded:: 2.5
The ``_ast`` module helps Python applications to process trees of the Python
abstract syntax grammar. The abstract syntax itself might change with each
Python release; this module helps to find out programmatically what the current
grammar looks like.
An abstract syntax tree can be generated by passing :data:`_ast.PyCF_ONLY_AST`
as a flag to the :func:`compile` builtin function. The result will be a tree of
objects whose classes all inherit from :class:`_ast.AST`.
A modified abstract syntax tree can be compiled into a Python code object using
the built-in :func:`compile` function.
The actual classes are derived from the ``Parser/Python.asdl`` file, which is
reproduced below. There is one class defined for each left-hand side symbol in
the abstract grammar (for example, ``_ast.stmt`` or ``_ast.expr``). In addition,
there is one class defined for each constructor on the right-hand side; these
classes inherit from the classes for the left-hand side trees. For example,
``_ast.BinOp`` inherits from ``_ast.expr``. For production rules with
alternatives (aka "sums"), the left-hand side class is abstract: only instances
of specific constructor nodes are ever created.
Each concrete class has an attribute ``_fields`` which gives the names of all
child nodes.
Each instance of a concrete class has one attribute for each child node, of the
type as defined in the grammar. For example, ``_ast.BinOp`` instances have an
attribute ``left`` of type ``_ast.expr``. Instances of ``_ast.expr`` and
``_ast.stmt`` subclasses also have lineno and col_offset attributes. The lineno
is the line number of source text (1 indexed so the first line is line 1) and
the col_offset is the utf8 byte offset of the first token that generated the
node. The utf8 offset is recorded because the parser uses utf8 internally.
If these attributes are marked as optional in the grammar (using a question
mark), the value might be ``None``. If the attributes can have zero-or-more
values (marked with an asterisk), the values are represented as Python lists.
All possible attributes must be present and have valid values when compiling an
AST with :func:`compile`.
The constructor of a class ``_ast.T`` parses their arguments as follows:
* If there are positional arguments, there must be as many as there are items in
``T._fields``; they will be assigned as attributes of these names.
* If there are keyword arguments, they will set the attributes of the same names
to the given values.
For example, to create and populate a ``UnaryOp`` node, you could use ::
node = _ast.UnaryOp()
node.op = _ast.USub()
node.operand = _ast.Num()
node.operand.n = 5
node.operand.lineno = 0
node.operand.col_offset = 0
node.lineno = 0
node.col_offset = 0
or the more compact ::
node = _ast.UnaryOp(_ast.USub(), _ast.Num(5, lineno=0, col_offset=0),
lineno=0, col_offset=0)
Abstract Grammar
----------------
The module defines a string constant ``__version__`` which is the decimal
subversion revision number of the file shown below.
The abstract grammar is currently defined as follows:
.. literalinclude:: ../../Parser/Python.asdl
Doc/library/inspect.rst
Dosyayı görüntüle @
7be19aab
...
@@ -376,13 +376,9 @@ Note:
...
@@ -376,13 +376,9 @@ Note:
Retrieving source code
Retrieving source code
----------------------
----------------------
.. function:: getdoc(object)
.. function:: getdoc(object)
Get the documentation string for an object. All tabs are expanded to spaces. To
Get the documentation string for an object, cleaned up with :func:`cleandoc`.
clean up docstrings that are indented to line up with blocks of code, any
whitespace than can be uniformly removed from the second line onwards is
removed.
.. function:: getcomments(object)
.. function:: getcomments(object)
...
@@ -429,6 +425,15 @@ Retrieving source code
...
@@ -429,6 +425,15 @@ Retrieving source code
cannot be retrieved.
cannot be retrieved.
.. function:: cleandoc(doc)
Clean up indentation from docstrings that are indented to line up with blocks
of code. Any whitespace that can be uniformly removed from the second line
onwards is removed. Also, all tabs are expanded to spaces.
.. versionadded:: 2.6
.. _inspect-classes-functions:
.. _inspect-classes-functions:
Classes and functions
Classes and functions
...
...
Doc/library/language.rst
Dosyayı görüntüle @
7be19aab
...
@@ -15,7 +15,7 @@ These modules include:
...
@@ -15,7 +15,7 @@ These modules include:
.. toctree::
.. toctree::
parser.rst
parser.rst
_
ast.rst
ast.rst
symbol.rst
symbol.rst
token.rst
token.rst
keyword.rst
keyword.rst
...
...
Lib/inspect.py
Dosyayı görüntüle @
7be19aab
...
@@ -368,6 +368,13 @@ def getdoc(object):
...
@@ -368,6 +368,13 @@ def getdoc(object):
return
None
return
None
if
not
isinstance
(
doc
,
types
.
StringTypes
):
if
not
isinstance
(
doc
,
types
.
StringTypes
):
return
None
return
None
return
cleandoc
(
doc
)
def
cleandoc
(
doc
):
"""Clean up indentation from docstrings.
Any whitespace that can be uniformly removed from the second line
onwards is removed."""
try
:
try
:
lines
=
string
.
split
(
string
.
expandtabs
(
doc
),
'
\n
'
)
lines
=
string
.
split
(
string
.
expandtabs
(
doc
),
'
\n
'
)
except
UnicodeError
:
except
UnicodeError
:
...
...
Lib/test/test_ast.py
Dosyayı görüntüle @
7be19aab
import
sys
,
itertools
,
unittest
import
sys
,
itertools
,
unittest
from
test
import
test_support
from
test
import
test_support
import
_
ast
import
ast
def
to_tuple
(
t
):
def
to_tuple
(
t
):
if
t
is
None
or
isinstance
(
t
,
(
basestring
,
int
,
long
,
complex
)):
if
t
is
None
or
isinstance
(
t
,
(
basestring
,
int
,
long
,
complex
)):
...
@@ -123,9 +123,9 @@ eval_tests = [
...
@@ -123,9 +123,9 @@ eval_tests = [
class
AST_Tests
(
unittest
.
TestCase
):
class
AST_Tests
(
unittest
.
TestCase
):
def
_assert_order
(
self
,
ast_node
,
parent_pos
):
def
_assert_order
(
self
,
ast_node
,
parent_pos
):
if
not
isinstance
(
ast_node
,
_
ast
.
AST
)
or
ast_node
.
_fields
is
None
:
if
not
isinstance
(
ast_node
,
ast
.
AST
)
or
ast_node
.
_fields
is
None
:
return
return
if
isinstance
(
ast_node
,
(
_ast
.
expr
,
_ast
.
stmt
,
_
ast
.
excepthandler
)):
if
isinstance
(
ast_node
,
(
ast
.
expr
,
ast
.
stmt
,
ast
.
excepthandler
)):
node_pos
=
(
ast_node
.
lineno
,
ast_node
.
col_offset
)
node_pos
=
(
ast_node
.
lineno
,
ast_node
.
col_offset
)
self
.
assert_
(
node_pos
>=
parent_pos
)
self
.
assert_
(
node_pos
>=
parent_pos
)
parent_pos
=
(
ast_node
.
lineno
,
ast_node
.
col_offset
)
parent_pos
=
(
ast_node
.
lineno
,
ast_node
.
col_offset
)
...
@@ -142,29 +142,29 @@ class AST_Tests(unittest.TestCase):
...
@@ -142,29 +142,29 @@ class AST_Tests(unittest.TestCase):
(
single_tests
,
single_results
,
"single"
),
(
single_tests
,
single_results
,
"single"
),
(
eval_tests
,
eval_results
,
"eval"
)):
(
eval_tests
,
eval_results
,
"eval"
)):
for
i
,
o
in
itertools
.
izip
(
input
,
output
):
for
i
,
o
in
itertools
.
izip
(
input
,
output
):
ast_tree
=
compile
(
i
,
"?"
,
kind
,
_
ast
.
PyCF_ONLY_AST
)
ast_tree
=
compile
(
i
,
"?"
,
kind
,
ast
.
PyCF_ONLY_AST
)
self
.
assertEquals
(
to_tuple
(
ast_tree
),
o
)
self
.
assertEquals
(
to_tuple
(
ast_tree
),
o
)
self
.
_assert_order
(
ast_tree
,
(
0
,
0
))
self
.
_assert_order
(
ast_tree
,
(
0
,
0
))
def
test_nodeclasses
(
self
):
def
test_nodeclasses
(
self
):
x
=
_
ast
.
BinOp
(
1
,
2
,
3
,
lineno
=
0
)
x
=
ast
.
BinOp
(
1
,
2
,
3
,
lineno
=
0
)
self
.
assertEquals
(
x
.
left
,
1
)
self
.
assertEquals
(
x
.
left
,
1
)
self
.
assertEquals
(
x
.
op
,
2
)
self
.
assertEquals
(
x
.
op
,
2
)
self
.
assertEquals
(
x
.
right
,
3
)
self
.
assertEquals
(
x
.
right
,
3
)
self
.
assertEquals
(
x
.
lineno
,
0
)
self
.
assertEquals
(
x
.
lineno
,
0
)
# node raises exception when not given enough arguments
# node raises exception when not given enough arguments
self
.
assertRaises
(
TypeError
,
_
ast
.
BinOp
,
1
,
2
)
self
.
assertRaises
(
TypeError
,
ast
.
BinOp
,
1
,
2
)
# can set attributes through kwargs too
# can set attributes through kwargs too
x
=
_
ast
.
BinOp
(
left
=
1
,
op
=
2
,
right
=
3
,
lineno
=
0
)
x
=
ast
.
BinOp
(
left
=
1
,
op
=
2
,
right
=
3
,
lineno
=
0
)
self
.
assertEquals
(
x
.
left
,
1
)
self
.
assertEquals
(
x
.
left
,
1
)
self
.
assertEquals
(
x
.
op
,
2
)
self
.
assertEquals
(
x
.
op
,
2
)
self
.
assertEquals
(
x
.
right
,
3
)
self
.
assertEquals
(
x
.
right
,
3
)
self
.
assertEquals
(
x
.
lineno
,
0
)
self
.
assertEquals
(
x
.
lineno
,
0
)
# this used to fail because Sub._fields was None
# this used to fail because Sub._fields was None
x
=
_
ast
.
Sub
()
x
=
ast
.
Sub
()
def
test_pickling
(
self
):
def
test_pickling
(
self
):
import
pickle
import
pickle
...
@@ -181,8 +181,99 @@ class AST_Tests(unittest.TestCase):
...
@@ -181,8 +181,99 @@ class AST_Tests(unittest.TestCase):
ast2
=
mod
.
loads
(
mod
.
dumps
(
ast
,
protocol
))
ast2
=
mod
.
loads
(
mod
.
dumps
(
ast
,
protocol
))
self
.
assertEquals
(
to_tuple
(
ast2
),
to_tuple
(
ast
))
self
.
assertEquals
(
to_tuple
(
ast2
),
to_tuple
(
ast
))
class
ASTHelpers_Test
(
unittest
.
TestCase
):
def
test_parse
(
self
):
a
=
ast
.
parse
(
'foo(1 + 1)'
)
b
=
compile
(
'foo(1 + 1)'
,
'<unknown>'
,
'exec'
,
ast
.
PyCF_ONLY_AST
)
self
.
assertEqual
(
ast
.
dump
(
a
),
ast
.
dump
(
b
))
def
test_dump
(
self
):
node
=
ast
.
parse
(
'spam(eggs, "and cheese")'
)
self
.
assertEqual
(
ast
.
dump
(
node
),
"Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), "
"args=[Name(id='eggs', ctx=Load()), Str(s='and cheese')], "
"keywords=[], starargs=None, kwargs=None))])"
)
self
.
assertEqual
(
ast
.
dump
(
node
,
annotate_fields
=
False
),
"Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), "
"Str('and cheese')], [], None, None))])"
)
self
.
assertEqual
(
ast
.
dump
(
node
,
include_attributes
=
True
),
"Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), "
"lineno=1, col_offset=0), args=[Name(id='eggs', ctx=Load(), "
"lineno=1, col_offset=5), Str(s='and cheese', lineno=1, "
"col_offset=11)], keywords=[], starargs=None, kwargs=None, "
"lineno=1, col_offset=0), lineno=1, col_offset=0)])"
)
def
test_copy_location
(
self
):
src
=
ast
.
parse
(
'1 + 1'
,
mode
=
'eval'
)
src
.
body
.
right
=
ast
.
copy_location
(
ast
.
Num
(
2
),
src
.
body
.
right
)
self
.
assertEqual
(
ast
.
dump
(
src
,
include_attributes
=
True
),
'Expression(body=BinOp(left=Num(n=1, lineno=1, col_offset=0), '
'op=Add(), right=Num(n=2, lineno=1, col_offset=4), lineno=1, '
'col_offset=0))'
)
def
test_fix_missing_locations
(
self
):
src
=
ast
.
parse
(
'write("spam")'
)
src
.
body
.
append
(
ast
.
Expr
(
ast
.
Call
(
ast
.
Name
(
'spam'
,
ast
.
Load
()),
[
ast
.
Str
(
'eggs'
)],
[],
None
,
None
)))
self
.
assertEqual
(
src
,
ast
.
fix_missing_locations
(
src
))
self
.
assertEqual
(
ast
.
dump
(
src
,
include_attributes
=
True
),
"Module(body=[Expr(value=Call(func=Name(id='write', ctx=Load(), "
"lineno=1, col_offset=0), args=[Str(s='spam', lineno=1, "
"col_offset=6)], keywords=[], starargs=None, kwargs=None, "
"lineno=1, col_offset=0), lineno=1, col_offset=0), "
"Expr(value=Call(func=Name(id='spam', ctx=Load(), lineno=1, "
"col_offset=0), args=[Str(s='eggs', lineno=1, col_offset=0)], "
"keywords=[], starargs=None, kwargs=None, lineno=1, "
"col_offset=0), lineno=1, col_offset=0)])"
)
def
test_increment_lineno
(
self
):
src
=
ast
.
parse
(
'1 + 1'
,
mode
=
'eval'
)
self
.
assertEqual
(
ast
.
increment_lineno
(
src
,
n
=
3
),
src
)
self
.
assertEqual
(
ast
.
dump
(
src
,
include_attributes
=
True
),
'Expression(body=BinOp(left=Num(n=1, lineno=4, col_offset=0), '
'op=Add(), right=Num(n=1, lineno=4, col_offset=4), lineno=4, '
'col_offset=0))'
)
def
test_iter_fields
(
self
):
node
=
ast
.
parse
(
'foo()'
,
mode
=
'eval'
)
d
=
dict
(
ast
.
iter_fields
(
node
.
body
))
self
.
assertEqual
(
d
.
pop
(
'func'
)
.
id
,
'foo'
)
self
.
assertEqual
(
d
,
{
'keywords'
:
[],
'kwargs'
:
None
,
'args'
:
[],
'starargs'
:
None
})
def
test_iter_child_nodes
(
self
):
node
=
ast
.
parse
(
"spam(23, 42, eggs='leek')"
,
mode
=
'eval'
)
self
.
assertEqual
(
len
(
list
(
ast
.
iter_child_nodes
(
node
.
body
))),
4
)
iterator
=
ast
.
iter_child_nodes
(
node
.
body
)
self
.
assertEqual
(
next
(
iterator
)
.
id
,
'spam'
)
self
.
assertEqual
(
next
(
iterator
)
.
n
,
23
)
self
.
assertEqual
(
next
(
iterator
)
.
n
,
42
)
self
.
assertEqual
(
ast
.
dump
(
next
(
iterator
)),
"keyword(arg='eggs', value=Str(s='leek'))"
)
def
test_get_docstring
(
self
):
node
=
ast
.
parse
(
'def foo():
\n
"""line one
\n
line two"""'
)
self
.
assertEqual
(
ast
.
get_docstring
(
node
.
body
[
0
]),
'line one
\n
line two'
)
def
test_literal_eval
(
self
):
self
.
assertEqual
(
ast
.
literal_eval
(
'[1, 2, 3]'
),
[
1
,
2
,
3
])
self
.
assertEqual
(
ast
.
literal_eval
(
'{"foo": 42}'
),
{
"foo"
:
42
})
self
.
assertEqual
(
ast
.
literal_eval
(
'(True, False, None)'
),
(
True
,
False
,
None
))
self
.
assertRaises
(
ValueError
,
ast
.
literal_eval
,
'foo()'
)
def
test_main
():
def
test_main
():
test_support
.
run_unittest
(
AST_Tests
)
test_support
.
run_unittest
(
AST_Tests
,
ASTHelpers_Test
)
def
main
():
def
main
():
if
__name__
!=
'__main__'
:
if
__name__
!=
'__main__'
:
...
...
Lib/test/test_inspect.py
Dosyayı görüntüle @
7be19aab
...
@@ -185,6 +185,10 @@ class TestRetrievingSourceCode(GetSourceBase):
...
@@ -185,6 +185,10 @@ class TestRetrievingSourceCode(GetSourceBase):
self
.
assertEqual
(
inspect
.
getdoc
(
git
.
abuse
),
self
.
assertEqual
(
inspect
.
getdoc
(
git
.
abuse
),
'Another
\n\n
docstring
\n\n
containing
\n\n
tabs'
)
'Another
\n\n
docstring
\n\n
containing
\n\n
tabs'
)
def
test_cleandoc
(
self
):
self
.
assertEqual
(
inspect
.
cleandoc
(
'An
\n
indented
\n
docstring.'
),
'An
\n
indented
\n
docstring.'
)
def
test_getcomments
(
self
):
def
test_getcomments
(
self
):
self
.
assertEqual
(
inspect
.
getcomments
(
mod
),
'# line 1
\n
'
)
self
.
assertEqual
(
inspect
.
getcomments
(
mod
),
'# line 1
\n
'
)
self
.
assertEqual
(
inspect
.
getcomments
(
mod
.
StupidGit
),
'# line 20
\n
'
)
self
.
assertEqual
(
inspect
.
getcomments
(
mod
.
StupidGit
),
'# line 20
\n
'
)
...
...
Misc/NEWS
Dosyayı görüntüle @
7be19aab
...
@@ -72,6 +72,9 @@ Extension Modules
...
@@ -72,6 +72,9 @@ Extension Modules
Library
Library
-------
-------
- Factored out the indentation cleaning from inspect.getdoc() into
inspect.cleandoc() to ease standalone use.
- Issue #1798: Add ctypes calling convention that allows safe access
- Issue #1798: Add ctypes calling convention that allows safe access
to errno.
to errno.
...
...
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