Wenn Sie die Funktionsdefinitionen walk AST importieren oder inspect verwenden können.
Wenn Sie mehr Parsing neben Signaturen durchführen müssen, berücksichtigen Sie pyparsing oder funcparselib.
Wenn Sie noch Regexs verwenden müssen, ertragen Sie mit mir.
import re
# Python identifiers start with a letter or _,
#and continue with these or digits.
IDENT = '[A-Za-z_][A-Za-z_0-9]*'
# Commas between identifiers can have any amout of space on either side.
COMMA = '\s*,\s*'
# Parameter list can contain some positional parameters.
# For simplicity we ignore now named parameters, *args, and **kwargs.
# We catch the entire list.
PARAM_LIST = '\((' + IDENT+'?' + '(?:' + COMMA+IDENT + ')*'+ ')?\)'
# Definition starts with 'def', then identifier, some space, and param list.
DEF = 'def\s+(' + IDENT + ')\s*' + PARAM_LIST
ident_rx = re.compile(IDENT)
def_rx = re.compile(DEF)
def test(s):
match = def_rx.match(s)
if match:
name, paramlist = match.groups()
# extract individual params
params = [x.group() for x in ident_rx.finditer(paramlist or '')]
print s, name, params
else:
print s, 'does not match'
test('def foo(a, b)')
test('def foo()')
test('def foo(a,b,c , d, e)')
test('deff foo()')
test('def foo(a, 2b)')
Beachten Sie, dass der obige Code nicht Parameter mit Standardwerten verarbeiten kann, *args
oder **kwargs
oder dem Komma, geschweige denn Dinge wie def foo(a, (b, c))
legal in Python 2. All dies kann hinzugefügt werden, aber die Komplexität steigen wird.
Also, es sei denn, Ihr Fall ist ziemlich einfach (das Codebeispiel oben ist Borderline), siehe Parser Links oben.
Reguläre Ausdrücke sind keine Parser. –
Warum nicht [die AST gehen] (http://docs.python.org/dev/library/ast.html)? –
Das abschließende Komma ist tatsächlich von Python erlaubt. – 9000