なにげに
Pythonにはまってます.
すごく簡単.すごくCoolです.
まだ、使い始めたばかりですが、使いやすい、わかりやすい.
Rのサイトなのに、Python関連の記事が増えてます(汗
Pythonにはまってます.
すごく簡単.すごくCoolです.
まだ、使い始めたばかりですが、使いやすい、わかりやすい.
Rのサイトなのに、Python関連の記事が増えてます(汗
【PythonでPostgreSQLにアクセスする】
本当は、ODBCを使ったほうがいいのだろうけど.
mxODBCとかいうのが標準らしい?
PythonでSYBASEにアクセスしなければならなくなったので【pyodbc】を使ってみた.
まあまあ使えそう.
PyroでRPCなサーバーが立てられる.
いやこれ、すばらしい.
「集合知プログラミング」をAmazonでゲット.
O'reillyのページにあるPythonのソース(Examplesから取得可能)を見てみたんだけど、なんかちょっとバグいっぱいありそうな・・・
本館の方で、報告予定.
SimpleXMLRPCServerではまったので、そのメモの記事を追加.
「4.18 名前のついたアイテム群を集めておく」より抜粋.こんな使い方ができるんですね.辞書なのに、辞書のキー(文字列)をプロパティのようにして変数にアクセスできます.
class d(dict):
__getattr__ = dict.__getitem__
__setattr__ = dict.__setitem__
__delattr__ = dict.__delitem__
>>> d>>> ddd = d()
>>> ddd
{}
>>> ddd['a'] = [1,2,3]
>>> ddd
{'a': [1, 2, 3]}
>>> ddd.a
[1, 2, 3]
>>> dir(ddd)
['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__dict__', '__doc__', '__eq__', ...]
>>> ddd.keys()
['a']
>>> ddd.b = {}
>>> ddd
{'a': [1, 2, 3], 'b': {}}
>>> ddd.b
{}
>>> ddd['b']
{}
>>> ddd.__class__>>> ddd.__class__.d
Traceback (most recent call last):
File "", line 1, in
AttributeError: type object 'd' has no attribute 'd'
>>> ddd.values()
[[1, 2, 3], {}]
>>> ddd.items()
[('a', [1, 2, 3]), ('b', {})]
>>> dict(ddd.items())
{'a': [1, 2, 3], 'b': {}}
>>>
うーん・・・
下のエラーと同じようなエラーが出たときに見つけたページ.
ちょっとどういう状況で出たのか覚えていないし最近でないので放置.
再現したときに詳細を記述します.
Non-valid Unicode/XML with Python SimpleXMLRPCServer?
本番運用では静的ファイルはapache等で配信するべきだが、開発段階で静的ファイルを配信したい場合はこうします.
if settings.DEBUG:
urlpatterns += patterns('',
url(r'media/(?P.*)$', 'django.views.static.serve',
{'document_root': settings.MEDIA_ROOT}),
)
ブール演算子の引数にはブール値だけが使えるわけではない.
>>> string1, string2, string3 = '', 'Trondheim', 'Hammer Dance'
>>> non_null = string1 or string2 or string3
>>> non_null
'Trondheim'
result = オブジェクトA and オブジェクトB or オブジェクトC
saveした時点でセッションが増えます.
期限切れのセッションは、定期的に削除するようにしましょう.
Paginatorの確認
def test001(request):
'''ページネーターの動作確認'''
objects = ['john', 'paul', 'george', 'ringo']
p = Paginator(objects, 2)
try:
page1 = p.page(3)
except EmptyPage, e:
print e
page1 = p.page(1)
c = dict(
has_next=page1.has_next(),
has_previous=page1.has_previous(),
has_other_pages=page1.has_other_pages(),
next_page_number=page1.next_page_number(),
previous_page_number=page1.previous_page_number(),
start_index=page1.start_index(),
end_index=page1.end_index(),
object_list=page1.object_list,
number=page1.number,
test=None,
)
c = simplejson.dumps(c, sort_keys=True, indent=2 * ' ')
return HttpResponse(c, mimetype='application/json')
すべてのページをjsonにする
def test002(request):
'''ページネーターの動作確認'''
objects = ['john', 'paul', 'george', 'ringo', 'yyy']
p = Paginator(objects, 2)
pageRange = p.page_range
cc = {}
for ipage in pageRange:
page1 = p.page(ipage)
c = dict(
has_next=page1.has_next(),
has_previous=page1.has_previous(),
has_other_pages=page1.has_other_pages(),
next_page_number=page1.next_page_number(),
previous_page_number=page1.previous_page_number(),
start_index=page1.start_index(),
end_index=page1.end_index(),
object_list=page1.object_list,
number=page1.number,
test=None,
)
cc[ipage] = c
ccJson = simplejson.dumps(cc, sort_keys=True, indent=2 * ' ')
return HttpResponse(ccJson, mimetype='application/json')
64ビットLINUXにバイナリでインストールした.「libsslやらlibcryptoやらがない」と言われたので、インストールされていたlibssl.soとかをlibssl.so.0.98とかにシンボリックリンクを張ったらpypyの起動はするようになった.
ところが、いろいろ実行しようとしたら、ダンプを吐いてアボートする.
あきらめていたのだが、openssl0.98を入れてみたところ、アボートせず、正常に動いているようだ.cPythonの結果と比較したところ正常ぽい.
パフォーマンスはというと(ちなみにpypy-1.8)、python2.6より早い.
どのような処理を行うかでパフォーマンスの改善度合いは異なるようだが、管理人が行おうとしていた処理は
これが連邦の新型か?!
これから増やしていきます
pythonでは、文字列で与えられた式を評価する場合
eval
を、使うようです.
>>> eval('a')
Traceback (most recent call last):
File "", line 1, in
File "", line 1, in
NameError: name 'a' is not defined
>>> a = 3.5
>>> eval('a')
3.5
式の中で、代入を行う場合はcompileを使うと良いようです.
eval(compile("c = a+b", "(^.^)", "single"))
hogehogeという変数に値を代入する例
>>> eval(compile("c = 1.111", "(^.^)", "single"))
>>> c
1.111
>>> eval(compile("hogehoge = 1.111", "(^.^)", "single"))
>>> hogehoge
1.111
>>> s = "hogehoge = 'xyzzy'"
>>> s
"hogehoge = 'xyzzy'"
>>> eval(compile(s, "(^.^)", "single"))
>>> hogehoge
'xyzzy'
pythonで10進数から36進数に基数変換しなければならなかったのでGoogle先生に
「python base36」
で、教えてもらいました.
いちばん最後のでよいのかな
import string, mathint2base = lambda a, b: ''.join(
[(string.digits + string.lowercase + string.uppercase)[(a/b**i)%b]
for i in xrange(int(math.log(a, b)), -1, -1)]
)num = 1412823931503067241
test = int2base(num, 36)
test2 = int(test, 36)
print test2 == num
int2baseという関数がそれです.
int2base(x, base)というインターフェースになっています.
確認
>>> int2base(36, 36)
'10'
>>> int2base(1, 36)
'1'
>>> int2base(2, 36)
'2'
>>> int2base(36*36, 36)
'100'
こちらのページ(外部サイトです)にwsgiでPOSTのパラメータの取得方法が書いてあったのですが、pythonのcgiモジュールを利用したほうが良いと思ったのでちょっと調べてみました.
「PEP 333 -- Python Web Server Gateway Interface v1.0」のenviron Variablesの項目の下のほうにあるテーブルをみると、
wsgi.inputはAn input stream (file-like object)
と書いてあったので、
form = cgi.FieldStorage(fp=environ['wsgi.input'], environ=environ, keep_blank_values=True)
と、cgi.FieldStorageのfpパラメータにenviron['wsgi.input']を指定すれば、POSTのパラメータをcgiモジュールで利用することができます(wsgiのアプリケーション内で).
こういうすでにあるインターフェースを利用したほうが開発も効率的ですし、バグも混入しにくくなりますね.