To also check if all parameter in a Python function is valid then it's like the famous regex problem from email.
So this the is
fully RFC 822 compliant regex,i have never needed to use that regex to eg extract email from text.
So with the regex i posted it will find both last two examples.
import re
text = '''\
def my_game():
print('Game running')
def 123
def foo(arg):
pass
def Bar(args*, kwargs**):
pass
hello def is nice
def () wrong
def spam(ham=[n for n in range(1, dividend+1) if dividend % n == 0]):
pass
def foobar( **abc, *def ):
pass'''
# Make list of match
def_name = re.findall(r"def\s(\w+)\(.*", text)
def_line = re.findall(r"def\s\w+\(.*", text)
# Iterate over matches group() or group(1)
matches = re.finditer(r"def\s(\w+)\(.*", text)
for match in matches:
print(match.group(1))
Output:
my_game
foo
Bar
spam
foobar
>>> def_line
['def my_game():',
'def foo(arg):',
'def Bar(args*, kwargs**):',
'def spam(ham=[n for n in range(1, dividend+1) if dividend % n == 0]):',
'def foobar( **abc, *def ):']
I would
not try to write a regex for all cases,could as @
Gribouillis mention step it up with adding
pass
and try to run the function.
With the not valid one will get
SyntaxError
,valid one will return
None
or other error like
NameError
.
So if i test this it look like this:
>>> check = def_line[-1]
>>> check
'def foobar( **abc, *def ):'
>>> check = check.replace(':', ':pass')
>>> exec(check)
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
File "<string>", line 1
def foobar( **abc, *def ):pass
^
SyntaxError: invalid syntax
So with the valid ones:
>>> check = def_line[1]
>>> check = check.replace(':', ':pass')
>>> check
'def foo(arg):pass'
>>> repr(exec(check))
'None'
>>>
>>> check = def_line[-2]
>>> check = check.replace(':', ':pass')
>>> check
'def spam(ham=[n for n in range(1, dividend+1) if dividend % n == 0]):pass'
>>> exec(check)
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
File "<string>", line 1, in <module>
NameError: name 'dividend' is not defined