Is it possible to def a function with a dotted name in Python?
<p>In the question <a href="https://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do"><em>What does the "yield" keyword do?</em></a>, I found a Python syntax being used that I didn't expect to be valid. The question is old and has a huge number of votes, so I'm surprised nobody at least left a comment about this function definition:</p>

<pre><code>def node._get_child_candidates(self, distance, min_dist, max_dist):
    if self._leftchild and distance - max_dist &lt; self._median:
       yield self._leftchild
    if self._rightchild and distance + max_dist &gt;= self._median:
       yield self._rightchild  
</code></pre>

<p>What I tried to get this sort of syntax evaluated:</p>

<ul>
<li>assigning an attribute to a class or object</li>
<li>redefining a function of an imported module</li>
</ul>

<p>fails so far with </p>

<blockquote>
  <p>SyntaxError: invalid syntax</p>
</blockquote>

<p>I looked up the <a href="http://well-adjusted.de/~jrschulz/mspace/">link (maybe outdated)</a> given in the question, and searched the web for the usage of <code>def</code>, but I found nothing explaining this "dotted name" pattern. I'm using Python 3, maybe this is a feature of Python 2?</p>

<p><strong>Is (or was) this syntax valid, if yes what does it mean?</strong></p>

<p>No, the syntax is not valid. It is easy to prove by checking the documentation. In Python 2, an identifier is constructed by the following <a href="https://docs.python.org/2/reference/lexical_analysis.html#identifiers" rel="nofollow">rules</a>:</p>

<pre><code>identifier ::=  (letter|"_") (letter | digit | "_")*
letter     ::=  lowercase | uppercase
lowercase  ::=  "a"..."z"
uppercase  ::=  "A"..."Z"
digit      ::=  "0"..."9"
</code></pre>

<p>In Py3 the rules are more or less the same, beside being expanded up to the range of Unicode characters.</p>

<p>It seems that the author probably meant something like</p>

<pre><code>class Node:
    ...
    def _get_child_candidates(self, ...):
        ...
</code></pre>

python function syntax-error