Python: Difference between revisions
Jump to navigation
Jump to search
Line 125: | Line 125: | ||
b = a.prop # Using a property, OR |
b = a.prop # Using a property, OR |
||
b = a.getprop() # Using a getter |
b = a.getprop() # Using a getter |
||
</source> |
|||
== Unicode == |
|||
;Write the BOM |
|||
See [http://stackoverflow.com/questions/934160/write-to-utf-8-file-in-python] |
|||
<source lang=python> |
|||
import codecs |
|||
file = codecs.open("lol", "w", "utf-8") |
|||
file.write(u'\ufeff') # or use unicode name: u'\N{ZERO WIDTH NO-BREAK SPACE}' |
|||
file.close() |
|||
# Using https://docs.python.org/2/library/codecs.html#module-encodings.utf_8_sig |
|||
with codecs.open("test_output", "w", "utf-8-sig") as temp: |
|||
temp.write("hi mom\n") |
|||
</source> |
|||
;Handling unicode |
|||
Some recommends to always process unicode internally, and decode on input and encode on output [http://stackoverflow.com/questions/492483/setting-the-correct-encoding-when-piping-stdout-in-python]: |
|||
<source lang=python> |
|||
line = line.decode('utf-8') |
|||
# ...treat line as unicode... |
|||
print line.encode('utf-8') |
|||
</source> |
|||
But this is error prone. So another solution proposed is to <code>redefine sys.stdout</code>: |
|||
<source lang=python> |
|||
import sys |
|||
import codecs |
|||
sys.stdout = codecs.getwriter('utf8')(sys.stdout) |
|||
</source> |
|||
An hackish way (not recommended): |
|||
<source lang=python> |
|||
# -*- coding: utf-8 -*- |
|||
import sys |
|||
reload(sys) |
|||
sys.setdefaultencoding('utf-8') |
|||
print u"åäö" |
|||
</source> |
</source> |
Revision as of 17:26, 9 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
Started with | First method | Second method | Third method | Fourth method |
---|---|---|---|---|
import __main__ as main print hasattr(main, '__file__')
|
def in_ipython(): try: __IPYTHON__ except NameError: return False else: return True
|
import sys print hasattr(sys, 'ps1'):
|
import sys print bool(sys.flags.interactive)
| |
python mymod.py
|
True | - | - | - |
python -i mymod.py
|
True | - | - | 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()
orhasabc()
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
withNone
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
Unicode
- Write the BOM
See [4]
import codecs
file = codecs.open("lol", "w", "utf-8")
file.write(u'\ufeff') # or use unicode name: u'\N{ZERO WIDTH NO-BREAK SPACE}'
file.close()
# Using https://docs.python.org/2/library/codecs.html#module-encodings.utf_8_sig
with codecs.open("test_output", "w", "utf-8-sig") as temp:
temp.write("hi mom\n")
- Handling unicode
Some recommends to always process unicode internally, and decode on input and encode on output [5]:
line = line.decode('utf-8')
# ...treat line as unicode...
print line.encode('utf-8')
But this is error prone. So another solution proposed is to redefine sys.stdout
:
import sys
import codecs
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
An hackish way (not recommended):
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
print u"åäö"