Python: Difference between revisions

From miki
Jump to navigation Jump to search
Line 39: Line 39:


More available at http://docs.python.org/2/library/internet.html (see ''BaseHTTPServer'' and ''CGIHTTPServer'').
More available at http://docs.python.org/2/library/internet.html (see ''BaseHTTPServer'' and ''CGIHTTPServer'').

=== Detect interactive mode ===
References: [http://stackoverflow.com/questions/2356399/tell-if-python-is-in-interactive-mode], [http://stackoverflow.com/questions/1212779/detecting-when-a-python-script-is-being-run-interactively-in-ipython]

{| class=wikitable
|-
!Started with!!First method!!Second method!!Third method
|-
|
|<source lang=python>
import __main__ as main
print hasattr(main, '__file__')
</source>
|<source lang=python>
def in_ipython():
try:
__IPYTHON__
except NameError:
return False
else:
return True
</source>
|<source lang=python>
import sys

if hasattr(sys, 'ps1'):
print "Running interactively."
else:
print "Not running interactively..."
if sys.flags.interactive:
print "... but I'm in interactive postmortem mode."
</source>
|-
|<code>python mymod.py</code>
|True||-||-
|-
|<code>python</code> then <code>import mymod</code>
||-||-||True
|-
|<code>ipython mymod.py</code>
||True||True||-
|-
|<code>ipython -i mymod.py</code>
||True||True||-
|-
|<code>ipython</code> then <code>run mymod.py</code>
||True||True||-
|-
|<code>ipython</code> then <code>run -i mymod.py</code>
||True||True||-
|-
|<code>ipython</code> then <code>import mymod</code>
||-||True||-
|-
|<code>ipython -i</code> then <code>import mymod</code>
||-||True||-
|}


== Traps ==
== Traps ==

Revision as of 13:08, 8 April 2014

Links

  • Nice example of generating / testing regex in Python (with nice / small test framework) [1]

Shell

Use iPy (ipython) to get an interactive shell with auto-completion, instant help...

%magic                    # Get help on %magic commands (%run,...)
?run                      # Get help on %run magic
%run script.py            # Run given script
%run -i script.py         # ... with inspect mode on
%run -i -e script.py      # ... ... and ignore sys.exit() call
!cmd                      # Run shell command 'cmd', for instance ...
!ls                       # ... List file in current directory

Reference

Basic

for i in range(10):
    print i                      # carriage return

for i in range(10):
    print i,                     # no carriage return

Tips

Simple HTTP Server

It's very easy to setup an ad-hoc HTTP server with Python. Just open a shell in a folder with some contents to share, and type:

python -m SimpleHTTPServer

More available at http://docs.python.org/2/library/internet.html (see BaseHTTPServer and CGIHTTPServer).

Detect interactive mode

References: [2], [3]

Started with First method Second method Third method
import __main__ as main
print hasattr(main, '__file__')
def in_ipython():
    try:
        __IPYTHON__
    except NameError:
        return False
    else:
        return True
import sys

if hasattr(sys, 'ps1'):
    print "Running interactively."
else:
    print "Not running interactively..."
    if sys.flags.interactive:
        print "... but I'm in interactive postmortem mode."
python mymod.py True - -
python then import mymod - - True
ipython mymod.py True True -
ipython -i mymod.py True True -
ipython then run mymod.py True True -
ipython then run -i mymod.py True True -
ipython then import mymod - True -
ipython -i then import mymod - True -

Traps

Frequent mistakes. Beware the snake can bite you!

Confuse a method and a property in a test
SOLUTION: Stick to a convention. Like always define methods like isxyyz() or hasabc() as methods. Note that defining them as property would raise an exception if used as a function, and hence might be safer.
if A.isdummy():            # This will fail isdummy is a property
if A.isdummy:              # Always True if isdummy is a method
Mix 0 with None in a sequence
Testing whether an element is defined is more difficult.
a = [0,None,None,None]
bool(a[0])           # --> False
bool(a[1])           # --> False !!! How can we tell them apart?
a[1] == None         # --> True      This works, but is unusual and likely bad practice
Mixing property and normal getter
SOLUTION: prefix all getter method with get, like getvalue()
b = a.prop           # Using a property, OR
b = a.getprop()      # Using a getter