This is a VERY VERY rough draft of a PEP. The idea is that there should be some formal way that reST parsers can differentiate (in docstrings) between variable/function names and identical English words, within comments. 
<br>
<div class="gmail_quote"><div class="gmail_quote"><br>PEP: XXX<br>Title: Catching unmarked identifiers in docstrings<br>Version: 0.0.0.0.1<br>Last-Modified: 23-Aug-2007<br>Author: Jameson Quinn &lt;firstname dot lastname at gmail&gt;
<br>Status: Draft
<br>Type: Informational
<br>Content-Type: text/x-rst<br>Created: 23-Aug-2007<br>Post-History: 30-Aug-2002<br><br><br>Abstract<br>========<br><br>This PEP makes explicit some additional ways to parse docstrings and comments<br>for python identifiers. These are intended to be implementable on their own or
<br>as extensions to reST, and to make as many existing docstrings<br>as possible usable by tools that change the visible<br>representation of identifiers, such as translating (non-english) code editors<br>or visual programming environments. Docstrings in widely-used modules are 
<br>encouraged to use \`explicit backquotes\` to mark identifiers which are not<br>caught by these cases.<br><br>THIS IS AN EARLY DRAFT OF THIS PEP FOR DISCUSSION PURPOSES ONLY. ALL LOGIC IS<br>INTENTIONALLY DEFINED ONLY BY EXAMPLES AND THERE IS NO REFERENCE IMPLEMENTATION
<br>UNTIL A THERE ARE AT LEAST GLIMMERINGS OF CONSENSUS ON THE RULE SET.<br><br><br>Rationale<br>=========<br><br>Python, like most computer languages, is based on English. This can<br>represent a hurdle to those who do not speak English. Work is underway
<br>on Bityi_, a code viewer/editor which translates code to another language<br>on load and save. Among the many design issues in Bityi is that of<br>identifiers in docstrings. A view which translates the identifiers in
<br>
code, but leaves the untranslated identifier in the docstrings, makes<br>the docstrings worse than useless, even if the programmer has a <br>rudimentary grasp of English. Yet if all identifiers in docstrings are<br>translated, there is the problem of overtranslation in either direction.
<br>It is necessary to distinguish between the variable named &quot;variable&quot;,<br>which should be translated, and the comment that something is &quot;highly<br>variable&quot;, which should not. <br><br>.. _Bityi: <a href="http://wiki.laptop.org/go/Bityi" target="_blank">



http://wiki.laptop.org/go/Bityi</a><br><br>Note that this is just one use-case; syntax coloring and docstring hyperlinks are another one. This PEP is not the place for a discussion of all the pros<br>and cons of a translating viewer.
<br><br>PEP 287 standardizes reST as an optional way to markup docstrings. <br>This includes the possibility of using \`backquotes\` to flag Python<br>identifiers. However, as this PEP is purely optional, there are many<br>



cases of identifiers in docstrings which are not flagged as such. <br>Moreover, many of these unflagged cases could be caught programatically. <br>This would reduce the task of making a module internationally-viewable,<br>



or hyperlinkable, considerably.<br><br>This syntax is kept relatively open to allow for reuse with <br>other programming languages.<br><br><br>Common cases of identifiers in docstrings<br>=========================================
<br><br>The most common case is that of lists of argument or<br>method names. We call these &quot;identifier lists&quot;::<br><br>&nbsp; def register(func, *targs, **kargs):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;&quot;&quot;register a function to be executed someday
<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; func - function to be called<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; targs - optional arguments to pass<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kargs - optional keyword arguments to pass<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;&quot;&quot;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #func, targs, and kargs would be recognized as identifiers in the above.
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; class MyClass(object):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;&quot;&quot;Just a silly demonstration, with some methods:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; thisword&nbsp;&nbsp;&nbsp;&nbsp; : is a class method and you can call<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; it - it may even return a value.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; As with reST, the associated text can have
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; several paragraphs.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BUT - you can&#39;t nest this construct, so BUT isn&#39;t counted.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; anothermethod: is another method.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eventhis -- is counted as a method.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; anynumber --- of dashes are allowed in this syntax<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; But consider: two words are NOT counted as an identifier.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; things(that,look,like,functions): are functions (see below)<br>


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Also, the docstring may have explanatory text, below or by<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; itself: so we have to deal with that.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thus, any paragraph which is NOT preceded by an empty line<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; or another identifier list - like &quot;itself&quot; above - does not count
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; as an identifier.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;&quot;&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #thisword, anothermethod, eventhis, anynumber, and things would be <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #recognized&nbsp; as identifiers in the above.<br><br>Another case is things which look like functions, lists, indexes, or 
<br>dicts::<br><br>&nbsp;&nbsp;&nbsp; &quot;&quot;&quot;<br>&nbsp;&nbsp;&nbsp; afunction(is,a,word,with,parentheses)<br>
&nbsp;&nbsp;&nbsp; [a,list,is,a,bunch,of,words,in,brackets]<br>&nbsp;&nbsp;&nbsp; anindex[is, like, a, cross, between, the, above]<br>&nbsp;&nbsp;&nbsp; {adict:is,just:words,in:curly, brackets: likethis}<br>&nbsp;&nbsp;&nbsp; &quot;&quot;&quot;<br>&nbsp;&nbsp;&nbsp; #all of the above would be recogniszed as identifiers.
<br>&nbsp;&nbsp;&nbsp; <br>The &quot;syntax&quot; of what goes inside these is very loose. <br>identifier_list ::= [&lt;initial_word&gt;]&lt;opening_symbol&gt; &lt;content_word&gt; {&lt;separator_symbol&gt; &lt;content_word&gt;} &lt;closing symbol&gt;
<br>, with no whitespace after initial_word, and where separator_symbol is the set of symbols &quot;.,&lt;&gt;{}[]+-*^%=|/()[]{}&quot; MINUS closing_symbol. content_word could maybe be a quoted string, too.
<br>In the &quot;function name&quot;, no whitespace<br>is allowed, but the symbols &quot;.,*^=&gt;&lt;-&quot; are. Thus::<br><br>&nbsp;&nbsp;&nbsp; &quot;&quot;&quot;<br>&nbsp;&nbsp;&nbsp; this.long=&gt;function.*name(counts, and: so |do| these {so-called] arguments)
<br>&nbsp;&nbsp;&nbsp; {but,you - cant|use[nested]brackets{so,these,are.identifiers}but,these,arent}<br>&nbsp;&nbsp;&nbsp; {heres.an.example.of.&quot;a string, no identifiers in here&quot;,but.out.here.yes}<br>&nbsp;&nbsp;&nbsp; {<a href="http://even.one.pair.of.words.with.no" target="_blank">



even.one.pair.of.words.with.no</a>&nbsp;&nbsp;&nbsp; symbols.means.nothing.here.is.an.identifier}<br>&nbsp;&nbsp;&nbsp; Any of these structures that open on one line {but.close.on.<br>&nbsp;&nbsp;&nbsp; the.next} are NOT counted as identifiers.&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &quot;&quot;&quot;
<br>&nbsp;&nbsp;&nbsp; #in the above: lines 1,2,and the parts of 3 outside the quotes <br>&nbsp;&nbsp;&nbsp; #would be recognized as identifiers<br><br>The above flexibility is intended to cover the various possibilities for<br>argument lists in a fair subset of other languages. Languages which use only
<br>whitespace for argument separation are not covered by these rules.&nbsp;&nbsp;&nbsp; 
<br>&nbsp;&nbsp;&nbsp; <br>The final case is words that are in some_kind of mixedCase. These are only<br>optionally counted as identifiers if they are also present as an identifier OUTSIDE<br>the comments somewhere in the same file.<br>


<br>Doctest and preformatted reST sections should be considered as 100% python
<br>code and treated as identifiers (or keywords).<br><br>Recommended use<br>===============<br><br>The rules above are designed to catch the large majority of identifiers<br>already present in docstrings, while applying only extremely rarely to words
<br>that should properly be considered as natural language. However, they are <br>inevitably imperfect. All docstrings of modules intended for wide use should<br>manually fix all cases in which these rules fail. If the rules underapply,
<br>you can use either \`back quotes\` or parentheses() to mark words as<br>identifiers; if they overapply and reformatting tricks don&#39;t fix the<br>problem, &lt;SOME DIRECTIVE TO TURN OFF ALL THIS LOGIC FOR A STRING&gt;
<br><br>Optional use inside comments or non-docstring strings<br>=====================================================<br><br>Comments<br>--------<br><br>Comments or blocks of comments alone on consecutive lines should be able,
<br>optionally, to use these same tricks to spotlight identifiers.<br><br>Other strings<br>-------------<br><br>I&#39;m not sure yet what the rules should be here. One option I&#39;m considering<br>is to be able to turn on all the above logic with some evil hack such
<br>as &#39;&#39; &#39;a string like this, concatenated with an empty string&#39;.<br><br><br>Copyright<br>=========<br><br>This document has been placed in the public domain.<br><br><br> <br>..<br>&nbsp;&nbsp; Local Variables:<br>



&nbsp;&nbsp; mode: indented-text<br>&nbsp;&nbsp; indent-tabs-mode: nil<br>&nbsp;&nbsp; sentence-end-double-space: t<br>&nbsp;&nbsp; fill-column: 70<br>&nbsp;&nbsp; coding: utf-8<br>&nbsp;&nbsp; End:<br><br>
</div><br>
</div><br>