Looping through list of functions in a function in Python dynamically
<p>I'd like to see if it's possible to run through a list of functions in a function. The closest thing I could find is looping through an entire module. I only want to use a pre-selected list of functions.</p>

<p>Here's my original problem:</p>

<ol>
<li>Given a string, check each letter to see if any of the 5 tests fulfill.</li>
<li>If a minimum of 1 letter passes a check, return True.</li>
<li>If all letters in the string fails the check, return False.</li>
<li>For each letter in the string, we will check these functions: isalnum(), isalpha(), isdigit(), islower(), isupper()</li>
<li>The result of each test should print to different lines. </li>
</ol>

<p>Sample Input</p>

<pre><code>    qA2
</code></pre>

<p>Sample Output (must print to separate lines, True if at least one letter passes, or false is all letters fail each test):</p>

<pre><code>    True
    True
    True
    True
    True
</code></pre>

<p>I wrote this for one test. Of course I could just write 5 different sets of code but that seems ugly. Then I started wondering if I could just loop through all the tests they're asking for. </p>

<p>Code for just one test:</p>

<pre><code>    raw = 'asdfaa3fa'
    counter = 0
    for i in xrange(len(raw)):
        if raw[i].isdigit() == True: ## This line is where I'd loop in diff func's
            counter = 1
            print True
            break
    if counter == 0:
        print False
</code></pre>

<p>My fail attempt to run a loop with all the tests:</p>

<pre><code>    raw = 'asdfaa3fa'
    lst = [raw[i].isalnum(),raw[i].isalpha(),raw[i].isdigit(),raw[i].islower(),raw[i].isupper()]
    counter = 0
    for f in range(0,5):
        for i in xrange(len(raw)):
            if lst[f] == True: ## loop through f, which then loops through i
                print lst[f] 
                counter = 1
                print True
        break
        if counter == 0:
    print False
</code></pre>

<p>So how do I fix this code to fulfill all the rules up there?</p>

<hr>

<p><strong>Using info from all the comments - this code fulfills the rules stated above, looping through each method dynamically as well.</strong></p>

<pre><code>    raw = 'ABC'
    functions = [str.isalnum, str.isalpha, str.isdigit, str.islower,  str.isupper]

    for func in functions:
        print any(func(letter) for letter in raw)
</code></pre>

<p><strong>getattr approach (I think this is called introspection method?)</strong></p>

<pre><code>    raw = 'ABC'

    meths = ['isalnum', 'isalpha', 'isdigit', 'islower', 'isupper']
    for m in meths: 
        print any(getattr(c,m)() for c in raw)
</code></pre>

<p><strong>List comprehension approach:</strong></p>

<pre><code>    from __future__ import print_function ## Changing to Python 3 to use print in list comp

    raw = 'ABC'
    functions = [str.isalnum, str.isalpha, str.isdigit, str.islower, str.isupper]
    solution = [print(func(raw)) for func in functions]
</code></pre>

<p>Okay, so the first question is easy enough. The simple way to do it is just do</p>

<pre><code>def foo(raw):
  for c in raw:
    if c.isalpha(): return True
    if c.isdigit(): return True
    # the other cases
  return False
</code></pre>

<p>Never neglect the simplest thing that could work.</p>

<p>Now, if you want to do it <em>dynamically</em> -- which is the magic keyword you probably needed, you want to apply something like this (cribbed from <a href="http://stackoverflow.com/questions/17734618/dynamic-method-call-in-python-2-7-using-strings-of-method-names">another question</a>):</p>

<pre><code>meths = [isalnum, isalpha, isdigit, islower, isupper]
for c in raw:    
  for m in meths:
    getattr(c, m)()
</code></pre>

<p>Warning, this is untested code meant to give you the idea. The key notion here is that the methods of an object are attributes just like anything else, so, for example <code>getattr("a", "isalpha")()</code> does the following:</p>

<ul>
<li>Uses <code>getattr</code> to search the attributes dictionary of <code>"a"</code> for a method named <code>isalpha</code></li>
<li>Returns that method itself -- <code>&lt;function isalpha&gt;</code></li>
<li>then invokes that method using the <code>()</code> which is the function application operator in Python.</li>
</ul>

<p>See this example:</p>

<pre><code>In [11]: getattr('a', 'isalpha')()
Out[11]: True
</code></pre>

python list loops