<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>HWPS! &#187; python</title>
	<atom:link href="http://holy.enyou.org/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://holy.enyou.org</link>
	<description>HoLY's Web Press Site</description>
	<lastBuildDate>Fri, 28 Jan 2011 04:19:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>俺も Amazon の Proxy を Google App Engine で作ってみた</title>
		<link>http://holy.enyou.org/2009/07/14/gae-amazon-proxy/</link>
		<comments>http://holy.enyou.org/2009/07/14/gae-amazon-proxy/#comments</comments>
		<pubDate>Mon, 13 Jul 2009 18:20:23 +0000</pubDate>
		<dc:creator>HoLY</dc:creator>
				<category><![CDATA[tech]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://holy.enyou.org/?p=332</guid>
		<description><![CDATA[んで GitHub で公開。

http://github.com/holysugar/gae-amazon-proxy/tree/master

しかし作ってみた、のはいいがもういろいろ出てまわってるんだよなあ。:)


Amazon API認証のPROXYを書いたよ(2) &#8211; ただのにっき(2009-07-06)
AmazonのProduct Advertising API認証プロキシ(REST版・GAE用)ソース &#8211; 風柳メモ
Amazon API認証のPROXYをGoogle App Engine Oilで書いたよ(3) &#8211; ぽっぺん日記@karashi.org(2009-07-06)
404 Blog Not Found:Ajax &#8211; AWS Caching Proxy w/ Authentication Support


基本的にはただただしさんの amazon-auth-proxy の Python での GAE への移植。

たぶん、他の人のと似たようなバグがあるだろう。チェックしておかねばなあ。

最終目的は isbn anchor plugin 用の(透過でない) Proxy なんで、この Proxy を(おおっぴらに)公開はいまのところしてない。

今の仕事は Python を使ってがりがり書いてるせいか、特に Python で書くことに何の違和感もなくなってしまったなあ。何の制約もなければ Ruby やら Rails やらを使ってるんだけれども、 GAE 上で何かするなら Python でいいべ、と。これくらいのコードならすごく書きやすいし。

う、テスト書いてませんごめんなさい……(誰に謝ってるんだ)。
]]></description>
			<content:encoded><![CDATA[<p>んで GitHub で公開。</p>

<p><a href="http://github.com/holysugar/gae-amazon-proxy/tree/master">http://github.com/holysugar/gae-amazon-proxy/tree/master</a></p>

<p>しかし作ってみた、のはいいがもういろいろ出てまわってるんだよなあ。:)</p>

<ul>
<li><a href="http://sho.tdiary.net/20090706.html#p01" title="Amazon API認証のPROXYを書いたよ(2) - ただのにっき(2009-07-06)">Amazon API認証のPROXYを書いたよ(2) &#8211; ただのにっき(2009-07-06)</a></li>
<li><a href="http://d.hatena.ne.jp/furyu-tei/20090703/paproxy" title="AmazonのProduct Advertising API認証プロキシ(REST版・GAE用)ソース - 風柳メモ">AmazonのProduct Advertising API認証プロキシ(REST版・GAE用)ソース &#8211; 風柳メモ</a></li>
<li><a href="http://www.karashi.org/~poppen/d/20090706.html#p01" title="Amazon API認証のPROXYをGoogle App Engine Oilで書いたよ(3) - ぽっぺん日記@karashi.org(2009-07-06)">Amazon API認証のPROXYをGoogle App Engine Oilで書いたよ(3) &#8211; ぽっぺん日記@karashi.org(2009-07-06)</a></li>
<li><a href="http://blog.livedoor.jp/dankogai/archives/51227901.html" title="404 Blog Not Found:Ajax - AWS Caching Proxy w/ Authentication Support">404 Blog Not Found:Ajax &#8211; AWS Caching Proxy w/ Authentication Support</a></li>
</ul>

<p>基本的にはただただしさんの <a href="http://github.com/tdtds/amazon-auth-proxy" title="amazon-auth-proxy">amazon-auth-proxy</a> の Python での GAE への移植。</p>

<p>たぶん、他の人のと似たようなバグがあるだろう。チェックしておかねばなあ。</p>

<p>最終目的は isbn anchor plugin 用の(透過でない) Proxy なんで、この Proxy を(おおっぴらに)公開はいまのところしてない。</p>

<p>今の仕事は Python を使ってがりがり書いてるせいか、特に Python で書くことに何の違和感もなくなってしまったなあ。何の制約もなければ Ruby やら Rails やらを使ってるんだけれども、 GAE 上で何かするなら Python でいいべ、と。これくらいのコードならすごく書きやすいし。</p>

<p>う、テスト書いてませんごめんなさい……(誰に謝ってるんだ)。</p>
]]></content:encoded>
			<wfw:commentRss>http://holy.enyou.org/2009/07/14/gae-amazon-proxy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python のデフォルト引数は一度しか評価されない</title>
		<link>http://holy.enyou.org/2009/05/07/python-default-parameter-is-evaluated-once/</link>
		<comments>http://holy.enyou.org/2009/05/07/python-default-parameter-is-evaluated-once/#comments</comments>
		<pubDate>Thu, 07 May 2009 12:26:54 +0000</pubDate>
		<dc:creator>HoLY</dc:creator>
				<category><![CDATA[tech]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://holy.enyou.org/2009/05/07/python-default-parameter-is-evaluated-once/</guid>
		<description><![CDATA[最近は仕事なんかで Python でコードを書くことが結構あるのだけど、知らずに惑ったことの一つに、関数のデフォルト引数が定義時にしか評価されない仕様というのがある。


デフォルトパラメタ値は関数定義を実行する際に値評価されます。 これは、デフォルトパラメタの式は関数を定義するときにただ一度だけ評価され、同じ&#8221;計算済みの&#8221;値が全ての呼び出しで使われることを意味します。


例えば無理矢理な例だけど、こんな風に使うことも可能。関数ローカルの変数扱いですな。

def fib(num, cache=[0,1]):
    assert len(cache) &#62; 1

    if len(cache) &#62; num:
        return cache[num]
    else:
        cache[num:num] = [fib(num-1) + fib(num-2)]
        return cache[num]

print fib(10) [...]]]></description>
			<content:encoded><![CDATA[<p>最近は仕事なんかで Python でコードを書くことが結構あるのだけど、知らずに惑ったことの一つに、関数のデフォルト引数が定義時にしか評価されない仕様というのがある。</p>

<blockquote cite="http://www.python.jp/doc/release/ref/function.html">
<p>デフォルトパラメタ値は関数定義を実行する際に値評価されます。 これは、デフォルトパラメタの式は関数を定義するときにただ一度だけ評価され、同じ&#8221;計算済みの&#8221;値が全ての呼び出しで使われることを意味します。</p>
</blockquote>

<p>例えば無理矢理な例だけど、こんな風に使うことも可能。関数ローカルの変数扱いですな。</p>

<pre><code>def fib(num, cache=[0,1]):
    assert len(cache) &gt; 1

    if len(cache) &gt; num:
        return cache[num]
    else:
        cache[num:num] = [fib(num-1) + fib(num-2)]
        return cache[num]

print fib(10) # =&gt; 55
</code></pre>

<p>試しに、この仕様に反して、 Python でも呼びだしの度にデフォルト引数が初期化されるようなコードを、デコレータを使って書いてみた。
デコレータというのは簡単に言うと関数に被せるラッパーを書くためのシンタックスシュガー。</p>

<pre><code>def newdefaults(fn):
    import copy
    arity = fn.func_code.co_argcount
    newdefaults.defaults = copy.deepcopy(fn.func_defaults)

    def newfn(*args):
        args = list(args)

        while len(args) &lt; arity:
            index = len(args) - arity + len(newdefaults.defaults)
            if index &lt; 0: # 引数たりない
                return fn(*args)
            arg = newdefaults.defaults[index]
            args.append(copy.deepcopy(arg))
        return fn(*args)

    return newfn

if __name__ == '__main__':

    @newdefaults
    def f(v1, v2, d=0, a=[0]):
        print "f(%s, %s, %s, %s)" % (v1, v2, d, a)
        a.append(v1)
        return a

    assert f(1,0) == [0,1]
    assert f(2,0) == [0,2]
    try:
        f()
        assert False
    except TypeError, e:
        print e # OK
    except:
        print "Unexpected error"
        assert False
</code></pre>

<p>結果はこう。</p>

<pre><code>f(1, 0, 0, [0])
f(2, 0, 0, [0])
f() takes at least 2 arguments (0 given)
</code></pre>

<ul>
<li><code>*args</code> および <code>**kwargs</code> を引数にとる関数には適用できないはず。</li>
<li>ポイント: 関数の様子はある程度は function のプロパティ、<code>f.func_defaults</code> や <code>f.func_code</code> などから分かる。もっと詳しく調べたいときは <code>import inspect</code>。</li>
<li>deepcopy しちゃうとまずい時もありそうだけどまあいいか。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://holy.enyou.org/2009/05/07/python-default-parameter-is-evaluated-once/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

