pytho****@googl*****
pytho****@googl*****
2011年 11月 9日 (水) 05:49:34 JST
2 new revisions: Revision: de8380ce762a Author: Arihiro TAKASE <hinac****@gmail*****> Date: Tue Nov 8 12:38:17 2011 Log: 翻訳 2.7.2: faq/library, programming http://code.google.com/p/python-doc-ja/source/detail?r=de8380ce762a Revision: 587ddff8daca Author: Arihiro TAKASE <hinac****@gmail*****> Date: Tue Nov 8 12:48:15 2011 Log: merge http://code.google.com/p/python-doc-ja/source/detail?r=587ddff8daca ============================================================================== Revision: de8380ce762a Author: Arihiro TAKASE <hinac****@gmail*****> Date: Tue Nov 8 12:38:17 2011 Log: 翻訳 2.7.2: faq/library, programming http://code.google.com/p/python-doc-ja/source/detail?r=de8380ce762a Modified: /faq/library.rst /faq/programming.rst ======================================= --- /faq/library.rst Sat Mar 19 08:59:41 2011 +++ /faq/library.rst Tue Nov 8 12:38:17 2011 @@ -1,194 +1,189 @@ :tocdepth: 2 -========================= -Library and Extension FAQ -========================= +==================== +ライブラリと拡張 FAQ +==================== .. contents:: -General Library Questions -========================= - -How do I find a module or application to perform task X? --------------------------------------------------------- - -Check :ref:`the Library Reference <library-index>` to see if there's a relevant -standard library module. (Eventually you'll learn what's in the standard -library and will able to skip this step.) - -For third-party packages, search the `Python Package Index -<http://pypi.python.org/pypi>`_ or try `Google <http://www.google.com>`_ or -another Web search engine. Searching for "Python" plus a keyword or two for -your topic of interest will usually find something helpful. +ライブラリ一般の質問 +==================== + +作業 X を行うためのモジュールやアプリケーションを探すにはどうしますか? +----------------------------------------------------------------------- + +:ref:`the Library Reference <library-index>` で関連した +標準ライブラリモジュールがないか探してください。(いずれ、何が標準ライブラリ に +あるのかをおぼえて、この段階を飛ばせるようになるでしょう。) + +サードパーティのパッケージについては、\ `Python Package Index +<http://pypi.python.org/pypi>`_ を探したり、\ `Google <http://www.google.com>`_ +その他の Web サーチエンジンを試してください。"Python" に加えて一つか二つの +キーワードで興味のある話題を検索すれば、たいてい役に立つものが +見つかるでしょう。 -Where is the math.py (socket.py, regex.py, etc.) source file? -------------------------------------------------------------- - -If you can't find a source file for a module it may be a built-in or -dynamically loaded module implemented in C, C++ or other compiled language. -In this case you may not have the source file or it may be something like -mathmodule.c, somewhere in a C source directory (not on the Python Path). - -There are (at least) three kinds of modules in Python: - -1) modules written in Python (.py); -2) modules written in C and dynamically loaded (.dll, .pyd, .so, .sl, etc); -3) modules written in C and linked with the interpreter; to get a list of these, - type:: +math.py (socket.py, regex.py, etc.) のソースファイルはどこにありますか? +------------------------------------------------------------------------ + +モジュールのソースファイルが見つからなかったら、それは C、C++、その他の +コンパイルされた言語で実装され、ビルトインまたは動的にロードされる +モジュールかもしれません。この場合、ソースファイルが存在しないか、 +(Python のパスではなく) C のソースディレクトリのどこかに +mathmodule.c のようにあるかもしれません。 + +Python のモジュールには、(少なくとも) 3 種類あります: + +1) Python で書かれたモジュール (.py)。 +2) C で書かれ、動的にロードされるモジュール (.dll, .pyd, .so, .sl, etc)。 +3) C で書かれ、インタプリタにリンクされているモジュール。このリストを得るに は、こうタイプしてください:: import sys - print sys.builtin_module_names + print(sys.builtin_module_names) -How do I make a Python script executable on Unix? -------------------------------------------------- - -You need to do two things: the script file's mode must be executable and the -first line must begin with ``#!`` followed by the path of the Python -interpreter. - -The first is done by executing ``chmod +x scriptfile`` or perhaps ``chmod 755 -scriptfile``. - -The second can be done in a number of ways. The most straightforward way is to -write :: +Python のスクリプトを Unix で実行可能にするにはどうしますか? +------------------------------------------------------------- + +二つの条件があります :スクリプトファイルのモードが実行可能で、最初の行が +``#!`` で始まり Python インタプリタのパスが続いていなければなりません。 + +前者は、\ ``chmod +x scriptfile``\ 、場合によっては ``chmod 755 scriptfile`` +を実行すればできます。 + +後者は、いくつかの方法でできます。最も単純な方法は、 +ファイルの最初の行に、プラットフォーム上の Python がインストールされている +パス名を用いて、こう書くことです:: #!/usr/local/bin/python -as the very first line of your file, using the pathname for where the Python -interpreter is installed on your platform. - -If you would like the script to be independent of where the Python interpreter -lives, you can use the "env" program. Almost all Unix variants support the -following, assuming the Python interpreter is in a directory on the user's -$PATH:: +スクリプトが Python インタプリタのありかに依らないようにするために、 +"env" プログラムを使えます。ほぼすべての Unix バリアントで、Python +インタプリタがユーザの $PATH ディレクトリにあれば、以下のようにできます:: #!/usr/bin/env python -*Don't* do this for CGI scripts. The $PATH variable for CGI scripts is often -very minimal, so you need to use the actual absolute pathname of the -interpreter. - -Occasionally, a user's environment is so full that the /usr/bin/env program -fails; or there's no env program at all. In that case, you can try the -following hack (due to Alex Rezinsky):: +CGI スクリプトではこれを *しないでください*\ 。 CGI スクリプトの $PATH 変数 は +往々にして小さすぎるので、インタプリタの実際のパス名を使わなくてはならない のです。 + +たまに、ユーザの環境がいっぱいすぎて /usr/bin/env プログラムが働かなかった り、 +env プログラムが全く無かったりします。その場合、 +(Alex Rezinsky による)以下の技法を試してください:: #! /bin/sh """:" exec python $0 ${1+"$@"} """ -The minor disadvantage is that this defines the script's __doc__ string. -However, you can fix that by adding :: +これには、スクリプトの __doc__ 文字列を定義するというちょっとした欠点があり ます。しかし、これを付け足せば直せます:: __doc__ = """...Whatever...""" -Is there a curses/termcap package for Python? ---------------------------------------------- +Python には curses/termcap パッケージはありますか? +--------------------------------------------------- .. XXX curses *is* built by default, isn't it? -For Unix variants: The standard Python source distribution comes with a curses -module in the ``Modules/`` subdirectory, though it's not compiled by default -(note that this is not available in the Windows distribution -- there is no -curses module for Windows). - -The curses module supports basic curses features as well as many additional -functions from ncurses and SYSV curses such as colour, alternative character set -support, pads, and mouse support. This means the module isn't compatible with -operating systems that only have BSD curses, but there don't seem to be any -currently maintained OSes that fall into this category. - -For Windows: use `the consolelib module -<http://effbot.org/zone/console-index.htm>`_. +Unix バリアントでは: 標準の Python ソース配布には、 +``Modules/`` サブディレクトリに curses モジュールが同梱されていますが、 +デフォルトではコンパイルされていません +(なお、Windows ディストリビューションでは使えません -- +Windows 用の curses モジュールはありません) + +curses モジュールには基礎的な curses の機能だけでなく、色や別の文字セットの +サポート、パッド、マウスのサポートなど、ncurses や SYSV curses 由来の +追加の関数も用意されています。これにより、このモジュールは BSD curses しか +持っていないオペレーティングシステムとの互換性を持たないことになりますが、 +そのような現行の OS はなさそうです。 + +Windows では: `the consolelib module +<http://effbot.org/zone/console-index.htm>`_ を使ってください。 -Is there an equivalent to C's onexit() in Python? -------------------------------------------------- - -The :mod:`atexit` module provides a register function that is similar to C's -onexit. +Python には C の onexit() に相当するものはありますか? +------------------------------------------------------ + +:mod:`atexit` モジュールは C の onexit と同じような +レジスタ関数を提供します。 -Why don't my signal handlers work? ----------------------------------- - -The most common problem is that the signal handler is declared with the wrong -argument list. It is called as :: +シグナルハンドラが動かないのですがなぜですか? +---------------------------------------------- + +最もありがちな問題は、シグナルハンドラが間違った引数リストで +宣言されていることです。これは次のように呼び出されます:: handler(signum, frame) -so it should be declared with two arguments:: +だから、これは二つの引数で宣言されるべきです:: def handler(signum, frame): ... -Common tasks +よくある作業 ============ -How do I test a Python program or component? --------------------------------------------- - -Python comes with two testing frameworks. The :mod:`doctest` module finds -examples in the docstrings for a module and runs them, comparing the output with -the expected output given in the docstring. - -The :mod:`unittest` module is a fancier testing framework modelled on Java and -Smalltalk testing frameworks. - -For testing, it helps to write the program so that it may be easily tested by -using good modular design. Your program should have almost all functionality -encapsulated in either functions or class methods -- and this sometimes has the -surprising and delightful effect of making the program run faster (because local -variable accesses are faster than global accesses). Furthermore the program -should avoid depending on mutating global variables, since this makes testing -much more difficult to do. - -The "global main logic" of your program may be as simple as :: +Python のプログラムやコンポーネントをテストするにはどうしますか? +----------------------------------------------------------------- + +Python には二つのテストフレームワークがついています。\ :mod:`doctest` +モジュールは 、モジュールの docstring から使用例を見つけてそれらを実行し、 +出力を docstring によって与えられた望まれる出力と比較します。 + +:mod:`unittest` モジュールは、Java や Smalltalk のテストフレームワークを +模した装飾されたテストフレームワークです。 + +テストには、プログラムを書くのに、簡単にテストできるように良い +モジュール式デザインを使うのが役に立ちます。プログラムは、ほとんど全ての +機能を関数かクラスメソッドにカプセル化させるべきです -- そうすることで +プログラムの起動が速くなる (ローカル変数のアクセスはグローバルなアクセスよ りも +速いから) という驚くべき嬉しい効果をもたらすこともあります。 +さらに、変化するグローバル変数はテストを行うのを非常に難しくするので、 +プログラムはそれに依らないようにしましょう。 + +プログラムの "global main logic" は、プログラムの main モジュールの最後に、 +次のようにシンプルに書くべきです:: if __name__ == "__main__": main_logic() -at the bottom of the main module of your program. - -Once your program is organized as a tractable collection of functions and class -behaviours you should write test functions that exercise the behaviours. A test -suite can be associated with each module which automates a sequence of tests. -This sounds like a lot of work, but since Python is so terse and flexible it's -surprisingly easy. You can make coding much more pleasant and fun by writing -your test functions in parallel with the "production code", since this makes it -easy to find bugs and even design flaws earlier. - -"Support modules" that are not intended to be the main module of a program may -include a self-test of the module. :: +一旦、関数とクラス動作を扱いやすいように集めてプログラムを構成したら、 +その動作を洗練させるようなテストを書きましょう。テストスイートには、 +それぞれの一連のテストを自動化したモジュールも関係します。 +それは大変そうですが、Python は簡潔で柔軟なので、驚くほど簡単です。 +テスト関数を"プロダクションコード"と並行して書くことにより、 +バグや設計上の欠陥を早く見つけることができるようになり、 +コードをもっとずっと快適に楽しく書けます。 + +プログラムのメインモジュールとして設計されたのではない "補助モジュール" に は、 +モジュールの自己テストを含めるといいでしょう:: if __name__ == "__main__": self_test() -Even programs that interact with complex external interfaces may be tested when -the external interfaces are unavailable by using "fake" interfaces implemented -in Python. +複雑な外部インタフェースと作用し合うプログラムでさえ、 +外部インタフェースが使えない時でも、Python で実装された +"fake" インタフェースを使ってテストできます。 -How do I create documentation from doc strings? ------------------------------------------------ - -The :mod:`pydoc` module can create HTML from the doc strings in your Python -source code. An alternative for creating API documentation purely from -docstrings is `epydoc <http://epydoc.sf.net/>`_. `Sphinx -<http://sphinx.pocoo.org>`_ can also include docstring content. +Python のドキュメント文字列からドキュメントを生成するにはどうしますか? +----------------------------------------------------------------------- + +:mod:`pydoc` モジュールで Python ソースコード内のドキュメント文字列から +HTML を生成できます。純粋に docstring から API ドキュメントを生成するには、 +他に `epydoc <http://epydoc.sf.net/>`_ という選択肢もあります。 +`Sphinx <http://sphinx.pocoo.org>`_ も docstring の内容を含めることができま す。 -How do I get a single keypress at a time? ------------------------------------------ - -For Unix variants: There are several solutions. It's straightforward to do this -using curses, but curses is a fairly large module to learn. Here's a solution -without curses:: +一度に一つの押鍵を取得するにはどうしますか? +-------------------------------------------- + +Unix バリアントでは: いくつかの方法があります。curses を使えば簡単ですが、 +curses はかなり大きいモジュールなので習得するのが難しいです。 +ここに curses を使わない解決策を挙げます:: import termios, fcntl, sys, os fd = sys.stdin.fileno() @@ -211,40 +206,39 @@ termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm) fcntl.fcntl(fd, fcntl.F_SETFL, oldflags) -You need the :mod:`termios` and the :mod:`fcntl` module for any of this to work, -and I've only tried it on Linux, though it should work elsewhere. In this code, -characters are read and printed one at a time. - -:func:`termios.tcsetattr` turns off stdin's echoing and disables canonical mode. -:func:`fcntl.fnctl` is used to obtain stdin's file descriptor flags and modify -them for non-blocking mode. Since reading stdin when it is empty results in an -:exc:`IOError`, this error is caught and ignored. +これを動かすためには、\ :mod:`termios` と :mod:`fcntl` モジュールが必要で す。 +また、多分他でも動きますが、Linux でしかこれを試していません。 +このコードでは、文字は一文字づつ読みこまれ、印字されます。 + +:func:`termios.tcsetattr` は stdin の反響を止め、標準モードを使えなくしま す。 +:func:`fcntl.fnctl` は、stdin のファイルディスクリプタフラグを取得し、 +それらをノンブロッキングモードに変えるのに使われます。stdin が空の時に +読み込むのは :exc:`IOError` になるので、このエラーは補足され、無視されま す。 -Threads -======= - -How do I program using threads? -------------------------------- - -.. XXX it's _thread in py3k - -Be sure to use the :mod:`threading` module and not the :mod:`thread` module. -The :mod:`threading` module builds convenient abstractions on top of the -low-level primitives provided by the :mod:`thread` module. - -Aahz has a set of slides from his threading tutorial that are helpful; see -http://www.pythoncraft.com/OSCON2001/. - - -None of my threads seem to run: why? ------------------------------------- - -As soon as the main thread exits, all threads are killed. Your main thread is -running too quickly, giving the threads no time to do any work. - -A simple fix is to add a sleep to the end of the program that's long enough for -all the threads to finish:: +スレッド +======== + +スレッドを使ったプログラムを書くにはどうしますか? +-------------------------------------------------- + +:mod:`thread` モジュールではなく、 +必ず :mod:`threading` モジュールを使ってください。\ :mod:`threading` +モジュールは、\ :mod:`thread` モジュールで提供される低レベルな +基本要素の、便利な抽象化を構成します。 + +Aahz は、役立つスレッディングのチュートリアルから成るスライドを揃えていま す。 +http://www.pythoncraft.com/OSCON2001/ を参照してください。 + + +スレッドが一つも実行されていないようです。なぜですか? +------------------------------------------------------ + +メインスレッドが終了するとともに、全てのスレッドは終了されます。 +メインスレッドは速く働きすぎるので、スレッドには何をする時間も与えられませ ん。 + +簡単な解決策は、プログラムの終わりに、スレッドが完了するのに十分な時間の +スリープを加えることです:: import threading, time @@ -257,11 +251,12 @@ time.sleep(10) # <----------------------------! -But now (on many platforms) the threads don't run in parallel, but appear to run -sequentially, one at a time! The reason is that the OS thread scheduler doesn't -start a new thread until the previous thread is blocked. - -A simple fix is to add a tiny sleep to the start of the run function:: +しかし、実際は (ほとんどのプラットフォームでは) スレッドは並行して +実行されるのではなく、一つづつ実行されるのです! なぜなら、OS の +スレッドスケジューラは、前のスレッドがブロックされるまで +新しいスレッドを開始しないからです。 + +簡単に治すには、関数の実行の最初にちょっとスリープを加えることです:: def thread_task(name, n): time.sleep(0.001) # <---------------------! @@ -273,23 +268,23 @@ time.sleep(10) -Instead of trying to guess how long a :func:`time.sleep` delay will be enough, -it's better to use some kind of semaphore mechanism. One idea is to use the -:mod:`Queue` module to create a queue object, let each thread append a token to -the queue when it finishes, and let the main thread read as many tokens from the -queue as there are threads. +:func:`time.sleep` による遅延をどれくらいとれば十分かを考えるより、 +セマフォ構造を使ったほうがいいです。一つのやり方は、 +:mod:`Queue` モジュールでキューオブジェクトを作り、それぞれの +スレッドが終了するごとにキューにトークンを加えさせ、メインスレッドに +スレッドがあるのと同じ数のトークンをキューから読み込ませるようにすることで す。 -How do I parcel out work among a bunch of worker threads? ---------------------------------------------------------- - -Use the :mod:`Queue` module to create a queue containing a list of jobs. The -:class:`~Queue.Queue` class maintains a list of objects with ``.put(obj)`` to -add an item to the queue and ``.get()`` to return an item. The class will take -care of the locking necessary to ensure that each job is handed out exactly -once. - -Here's a trivial example:: +たくさんのワーカースレッドに作業を割り振るにはどうしますか? +------------------------------------------------------------ + +:class:`Queue` モジュールで、 +作業のリストを含むキューを作ってください。\ :class:`~Queue.Queue` クラスは +オブジェクトのリストを保持し、 ``.put(obj)`` で要素を加え、\ ``.get()`` で +要素を返すことができます。ロッキングを引き受けるクラスは、 +全ての作業がちょうど一回づつ行われることを確実にしなければなりません。 + +ここにちょっとした例があります:: import threading, Queue, time @@ -327,7 +322,7 @@ print 'Main thread sleeping' time.sleep(5) -When run, this will produce the following output: +実行時には、以下のように出力されます: Running worker Running worker @@ -335,35 +330,36 @@ Running worker Running worker Main thread sleeping - Worker <Thread(worker 1, started)> running with argument 0 - Worker <Thread(worker 2, started)> running with argument 1 - Worker <Thread(worker 3, started)> running with argument 2 - Worker <Thread(worker 4, started)> running with argument 3 - Worker <Thread(worker 5, started)> running with argument 4 - Worker <Thread(worker 1, started)> running with argument 5 + Worker <Thread(worker 1, started 130283832797456)> running with argument 0 + Worker <Thread(worker 2, started 130283824404752)> running with argument 1 + Worker <Thread(worker 3, started 130283816012048)> running with argument 2 + Worker <Thread(worker 4, started 130283807619344)> running with argument 3 + Worker <Thread(worker 5, started 130283799226640)> running with argument 4 + Worker <Thread(worker 1, started 130283832797456)> running with argument 5 ... -Consult the module's documentation for more details; the ``Queue`` class -provides a featureful interface. - - -What kinds of global value mutation are thread-safe? ----------------------------------------------------- - -A global interpreter lock (GIL) is used internally to ensure that only one -thread runs in the Python VM at a time. In general, Python offers to switch -among threads only between bytecode instructions; how frequently it switches can -be set via :func:`sys.setcheckinterval`. Each bytecode instruction and -therefore all the C implementation code reached from each instruction is -therefore atomic from the point of view of a Python program. - -In theory, this means an exact accounting requires an exact understanding of the -PVM bytecode implementation. In practice, it means that operations on shared -variables of built-in data types (ints, lists, dicts, etc) that "look atomic" -really are. - -For example, the following operations are all atomic (L, L1, L2 are lists, D, -D1, D2 are dicts, x, y are objects, i, j are ints):: + +詳細はモジュールのドキュメントを参照してください。 +``Queue`` クラスで多機能なインタフェースを使えます。 + + +グローバルな値のスレッドセーフな変更の種類は何ですか? +------------------------------------------------------ + +グローバルインタプリタロック (GIL) が +内部で使われ、Python VM で一度に一つだけのスレッドが実行されることが +保証されています。一般に、Python ではスレッド間の切り替えを +バイトコード命令の間でのみ行います。切り替えの周期は、 +:func:`sys.setcheckinterval` で設定できます。したがって、 +それぞれのバイトコード命令、そしてそれぞれの命令が届く全ての C 実装コード は、 +Python プログラムの観点からは、アトミックです。 + +このことから、理論上は、正確な勘定のためには PVM バイトコードの実装を +理解することが必要です。実際上は、組み込みデータ型(整数、リスト、辞書、等 )の、 +変数を共有する"アトミックそうな"演算は、実際にアトミックです。 + +例えば、以下の演算は全てアトミックです (L、L1、L2 はリスト、 +D、D1、D2 は辞書、x、y はオブジェクト、i、j は整数です):: L.append(x) L1.extend(L2) @@ -377,142 +373,147 @@ D1.update(D2) D.keys() -These aren't:: +これらは、アトミックではありません:: i = i+1 L.append(L[-1]) L[i] = L[j] D[x] = D[x] + 1 -Operations that replace other objects may invoke those other objects' -:meth:`__del__` method when their reference count reaches zero, and that can -affect things. This is especially true for the mass updates to dictionaries and -lists. When in doubt, use a mutex! +他のオブジェクトを置き換えるような演算は、そのオブジェクトの参照カウントが +ゼロになったときに :meth:`__del__` メソッドを呼び出すことがあり、 +これが影響を及ぼすかもしれません。これは特に、辞書やリストの大規模な更新に +当てはまります。疑わしければ、mutex を使ってください! -Can't we get rid of the Global Interpreter Lock? ------------------------------------------------- +グローバルインタプリタロック (Global Interpreter Lock) を取り除くことはでき ないのですか? +----------------------------------------------------------------------------------------- .. XXX mention multiprocessing .. XXX link to dbeazley's talk about GIL? -The Global Interpreter Lock (GIL) is often seen as a hindrance to Python's -deployment on high-end multiprocessor server machines, because a multi-threaded -Python program effectively only uses one CPU, due to the insistence that -(almost) all Python code can only run while the GIL is held. - -Back in the days of Python 1.5, Greg Stein actually implemented a comprehensive -patch set (the "free threading" patches) that removed the GIL and replaced it -with fine-grained locking. Unfortunately, even on Windows (where locks are very -efficient) this ran ordinary Python code about twice as slow as the interpreter -using the GIL. On Linux the performance loss was even worse because pthread -locks aren't as efficient. - -Since then, the idea of getting rid of the GIL has occasionally come up but -nobody has found a way to deal with the expected slowdown, and users who don't -use threads would not be happy if their code ran at half at the speed. Greg's -free threading patch set has not been kept up-to-date for later Python versions. - -This doesn't mean that you can't make good use of Python on multi-CPU machines! -You just have to be creative with dividing the work up between multiple -*processes* rather than multiple *threads*. Judicious use of C extensions will -also help; if you use a C extension to perform a time-consuming task, the -extension can release the GIL while the thread of execution is in the C code and -allow other threads to get some work done. - -It has been suggested that the GIL should be a per-interpreter-state lock rather -than truly global; interpreters then wouldn't be able to share objects. -Unfortunately, this isn't likely to happen either. It would be a tremendous -amount of work, because many object implementations currently have global state. -For example, small integers and short strings are cached; these caches would -have to be moved to the interpreter state. Other object types have their own -free list; these free lists would have to be moved to the interpreter state. -And so on. - -And I doubt that it can even be done in finite time, because the same problem -exists for 3rd party extensions. It is likely that 3rd party extensions are -being written at a faster rate than you can convert them to store all their -global state in the interpreter state. - -And finally, once you have multiple interpreters not sharing any state, what -have you gained over running each interpreter in a separate process? +マルチスレッド Python プログラムは事実上一つの CPU しか使えず、 +(ほとんど) 全ての Python コードが グローバルインタプリタロック (GIL) が +保持されている間しか作動しなくなるということで、GIL は、 +Python をハイエンドなマルチプロセッササーバマシン上に配備する上で +邪魔であると見なされがちです。 + +Python 1.5 の時代に、Greg Stein は GIL をきめ細かいロッキングで置き換える +総合パッチ ("free threading" パッチ) セットを実装しました。 +残念ながら、(ロックがとても効率的な) Windows でさえ、標準的な +Python コードが、GIL を使ったインタプリタの 2 倍くらい遅くなりました。 +Linux では、pthread ロックが効率的でないので、パフォーマンスの損失が更に +酷いです。 + +その後、GIL を取り除くという案はたまに出てきますが、だれも予期される +減速に対処する方法を見つけられず、スレッドを使わないユーザはこーどが +半分の速度でしか動作しないのでは幸せではありません。Greg の +free threading パッチは、以降の Python バージョンには更新されていません。 + +これは、Python をマルチ CPU マシンで使いこなせないことを意味しません! +作業を複数の *スレッド* ではなく、複数の *プロセッサ* に分けることを +考えればいいのです。 +C 拡張をうまく使うことも役に立ちます。C 拡張を使ってに時間のかかる作業を +行わせれば、その実行のスレッドが C のコードにある間その拡張は +GIL を開放でき、他のスレッドに作業させることができます。 + +GIL を本当にグローバルにするより、インタプリタ状態ごとのロックにするべきと +いう提案もあります。そして、インタプリタはオブジェクトを共有するべきでは +ないということです。残念ながら、どちらも実現しないでしょう。多くの +オブジェクトの実装は現在、グローバル状態を持っているので、実現はたいへんな +大仕事になりそうです。例えば、小さな整数と短い文字列はキャッシュされます。 +このキャッシュはインタプリタ状態に動かされなくてはなりません。他の +オブジェクト型は自身の自由変数リストを持っています。 +これらの自由変数リストはインタプリタ状態に動かされなくてはなりません。 等々。 + +それどころか、その作業が終わる時が来るかもわかりません。なぜなら、 +サードパーティ拡張にも問題があるからです。サードパーティ拡張が書かれる +ペースは、インタプリタ状態にすべてのグローバル状態を格納するように変換でき る +ペースよりも速いことでしょう。 + +そして最後に、一旦複数のインタプリタを状態を全く共有しないようにしたとし て、 +それぞれのインタプリタを独立したプロセス上で動かしてなにが +得られるというのでしょうか? -Input and Output -================ - -How do I delete a file? (And other file questions...) ------------------------------------------------------ - -Use ``os.remove(filename)`` or ``os.unlink(filename)``; for documentation, see -the :mod:`os` module. The two functions are identical; :func:`unlink` is simply -the name of the Unix system call for this function. - -To remove a directory, use :func:`os.rmdir`; use :func:`os.mkdir` to create one. -``os.makedirs(path)`` will create any intermediate directories in ``path`` that -don't exist. ``os.removedirs(path)`` will remove intermediate directories as -long as they're empty; if you want to delete an entire directory tree and its -contents, use :func:`shutil.rmtree`. - -To rename a file, use ``os.rename(old_path, new_path)``. - -To truncate a file, open it using ``f = open(filename, "r+")``, and use -``f.truncate(offset)``; offset defaults to the current seek position. There's -also ```os.ftruncate(fd, offset)`` for files opened with :func:`os.open`, where -``fd`` is the file descriptor (a small integer). - -The :mod:`shutil` module also contains a number of functions to work on files -including :func:`~shutil.copyfile`, :func:`~shutil.copytree`, and -:func:`~shutil.rmtree`. +入力と出力 +========== + +ファイルを削除するにはどうしますか? (その他、ファイルに関する質問...) +---------------------------------------------------------------------- + +``os.remove(filename)`` または ``os.unlink(filename)`` を使ってください。 +ドキュメントは、\ :mod:`os` モジュールを参照してください。この二つの +関数は同じものです。\ :func:`unlink` は単に、 +この関数の Unix システムコールの名称です。 + +ディレクトリを削除するには、\ :func:`os.rmdir` を使ってください。作成には +:func:`os.mkdir` を使ってください。\ ``os.makedirs(path)`` は ``path`` の +中間のディレクトリの、存在しないものを作成します。\ ``os.removedirs(path)`` は +中間のディレクトリが空である限り、それらを削除します。 +ディレクトリツリー全体とその中身全てを削除したいなら、 \ :func:`shutil.rmtree` を +使ってください。 + +ファイルの名前を変更するには、\ ``os.rename(old_path, new_path)`` を +使ってください。 + +ファイルを切り詰めるには、\ ``f = open(filename, "r+")`` でファイルを開いて から、 +``f.truncate(offset)`` を使ってください。offset はデフォルトでは +現在のシーク位置です。\ :func:`os.open` で開かれたファイルのために、 +``os.ftruncate(fd, offset)`` もあります。\ ``fd`` はファイルディスクリプタ +(小さな整数) です。 + +:mod:`shutil` モジュールにも、\ :func:`~shutil.copyfile`\ 、 +:func:`~shutil.copytree`\ 、\ :func:`~shutil.rmtree` 等、ファイルに作用する +関数がいくつか含まれます。 -How do I copy a file? ---------------------- - -The :mod:`shutil` module contains a :func:`~shutil.copyfile` function. Note -that on MacOS 9 it doesn't copy the resource fork and Finder info. +ファイルをコピーするにはどうしますか? +-------------------------------------- + +:mod:`shutil` モジュールには :func:`~shutil.copyfile` 関数があります。 +なお、MacOS 9 ではリソースフォークやファインダー情報をコピーしません。 -How do I read (or write) binary data? -------------------------------------- - -To read or write complex binary data formats, it's best to use the :mod:`struct` -module. It allows you to take a string containing binary data (usually numbers) -and convert it to Python objects; and vice versa. - -For example, the following code reads two 2-byte integers and one 4-byte integer -in big-endian format from a file:: +バイナリデータを読み書きするにはどうしますか? +---------------------------------------------- + +複雑なバイナリデータ形式の読み書きには、\ :mod:`struct` モジュールを使うの が +一番です。これでバイナリデータ (通常は数) を含む文字列を取って、 +Python オブジェクトに変換することができますし、その逆もできます。 + +例えば、以下のコードはファイルから 2 バイトの整数 2 個と 4 バイトの +整数 1 個をビッグエンディアンフォーマットで読み込みます:: import struct - f = open(filename, "rb") # Open in binary mode for portability - s = f.read(8) - x, y, z = struct.unpack(">hhl", s) - -The '>' in the format string forces big-endian data; the letter 'h' reads one -"short integer" (2 bytes), and 'l' reads one "long integer" (4 bytes) from the -string. - -For data that is more regular (e.g. a homogeneous list of ints or thefloats), -you can also use the :mod:`array` module. + with open(filename, "rb") as f: + s = f.read(8) + x, y, z = struct.unpack(">hhl", s) + +フォーマット中の '>' はデータを強制的にビッグエンディアンにします。 +ファイルから、文字 'h' は一つの"整数"(2 バイト)を読み込み、 +文字 'l' は一つの"long 整数"を読み込みます。 + +より規則的なデータ (整数の、または浮動小数点数の均質なリスト等) には、 +:mod:`array` モジュールも使えます。 -I can't seem to use os.read() on a pipe created with os.popen(); why? ---------------------------------------------------------------------- - -:func:`os.read` is a low-level function which takes a file descriptor, a small -integer representing the opened file. :func:`os.popen` creates a high-level -file object, the same type returned by the built-in :func:`open` function. -Thus, to read n bytes from a pipe p created with :func:`os.popen`, you need to -use ``p.read(n)``. - - -How do I run a subprocess with pipes connected to both input and output? +os.popen() によって作られたパイプで os.read() が使われていないようです。な ぜですか? +------------------------------------------------------------------------------------ + +:func:`os.read` は、開かれたファイルを表す小さな数である +ファイルディスクリプタを取る低レベルな関数です。\ :func:`os.popen` は、 +組み込みの:func:`open` 関数が返すのと同じ型である高レベルな +ファイルオブジェクトを生成します。そうして、\ :func:`os.popen` から n バイ トを +読み込むには、\ ``p.read(n)`` とする必要があります。 + +パイプを入力と出力の両方に接続してサブプロセスを動かすにはどうしますか? ------------------------------------------------------------------------ .. XXX update to use subprocess -Use the :mod:`popen2` module. For example:: +:mod:`popen2` モジュールを使ってください。例えば:: import popen2 fromchild, tochild = popen2.popen2("command") @@ -520,32 +521,33 @@ tochild.flush() output = fromchild.readline() -Warning: in general it is unwise to do this because you can easily cause a -deadlock where your process is blocked waiting for output from the child while -the child is blocked waiting for input from you. This can be caused because the -parent expects the child to output more text than it does, or it can be caused -by data being stuck in stdio buffers due to lack of flushing. The Python parent -can of course explicitly flush the data it sends to the child before it reads -any output, but if the child is a naive C program it may have been written to -never explicitly flush its output, even if it is interactive, since flushing is -normally automatic. - -Note that a deadlock is also possible if you use :func:`popen3` to read stdout -and stderr. If one of the two is too large for the internal buffer (increasing -the buffer size does not help) and you ``read()`` the other one first, there is -a deadlock, too. - -Note on a bug in popen2: unless your program calls ``wait()`` or ``waitpid()``, -finished child processes are never removed, and eventually calls to popen2 will -fail because of a limit on the number of child processes. Calling -:func:`os.waitpid` with the :data:`os.WNOHANG` option can prevent this; a good -place to insert such a call would be before calling ``popen2`` again. - -In many cases, all you really need is to run some data through a command and get -the result back. Unless the amount of data is very large, the easiest way to do -this is to write it to a temporary file and run the command with that temporary -file as input. The standard module :mod:`tempfile` exports a ``mktemp()`` -function to generate unique temporary file names. :: +警告: 一般的に、これをするのは賢くありません。 +子があなたからの入力を待ってブロックされている間、プロセスが子からの入力を +待ってブロックされているというようなデッドロックを引き起こしやすいからで す。 +これは、親が子がそれよりも多くのテキストを出力することを期待することによ り、 +あるいはデータが書きださされないことで標準入出力バッファがスタックに +あることにより起こります。Python の親はもちろん子に送るデータを出力を +読み込む前に明示的に書きだすことができますが、子が素朴な C プログラムである と、 +それが対話的なものであってさえ、書き出しが通常自動的なものであるがゆえ、 +明示的に出力を書き出さないように書かれていることがあります。 + +なお、デッドロックは :func:`popen3` を使って標準出力や標準エラー出力を +読み込むときにも起こりえます。これらのどちらかが内部バッファにとって +大きすぎる (バッファサイズを増やしても役に立ちません) とき、もう片方を先に +``read()`` すると、同じくデッドロックが起こります。 + +popen2 におけるバグの注釈: プログラムが ``wait()`` や ``waitpid()`` を +呼び出さないかぎり、終了されていない子プロセスは取り除かれることがなく、 +いずれ popen2 を呼び出すときに、子プロセス数の制限のために +失敗することがあります。\ :func:`os.waitpid` を :data:`os.WNOHANG` オプショ ンを +つけて呼び出すことで、これを防げます。このような呼び出しをする場所は、 +``popen2`` を再び呼びだす前がいいです。 + +多くの場合、本当にやるべきことは、コマンドを通して少しのデータを実行し、 +結果を戻させることだけです。データの量がとても多いのでない限り、最も簡単な +方法は、それを一時ファイルに書きこみ、一時ファイルと入力としてコマンドを +実行することです。標準モジュール :mod:`tempfile` は、一意の一時ファイル名を +生成する ``mktemp()`` 関数をエクスポートします:: import tempfile import os @@ -576,79 +578,82 @@ self.err=open(errfile,"r").read() os.remove(errfile) -Note that many interactive programs (e.g. vi) don't work well with pipes -substituted for standard input and output. You will have to use pseudo ttys -("ptys") instead of pipes. Or you can use a Python interface to Don Libes' -"expect" library. A Python extension that interfaces to expect is called "expy" -and available from http://expectpy.sourceforge.net. A pure Python solution that -works like expect is `pexpect <http://pypi.python.org/pypi/pexpect/>`_. +なお、多くの対話的プログラム (vi など) は、パイプで標準入出力を置き換える +ことがうまくいきません。このようなときは、パイプの代わりに擬似 tty ("pty") を +使わなければなりません。または、Don Libes の "expect" ライブラリへの Python +インタフェースを使うこともできます。expect へのインタフェースをする +Python 拡張は "expy" と呼ばれ、 http://expectpy.sourceforge.net から +利用できます。expect のように働く pure Python な解決法は、 +`pexpect <http://pypi.python.org/pypi/pexpect/>`_ です。 -How do I access the serial (RS232) port? ----------------------------------------- - -For Win32, POSIX (Linux, BSD, etc.), Jython: + +シリアル (RS232) ポートにアクセスするにはどうしますか? +------------------------------------------------------- + +Win32、POSIX (Linux、BSD、など)、Jythonでは: http://pyserial.sourceforge.net -For Unix, see a Usenet post by Mitch Chapman: +Unix では、Mitch Chapman による Usenet の投稿を参照してください。 http://groups.google.com/groups?selm=****@ohioe***** -Why doesn't closing sys.stdout (stdin, stderr) really close it? ---------------------------------------------------------------- - -Python file objects are a high-level layer of abstraction on top of C streams, -which in turn are a medium-level layer of abstraction on top of (among other -things) low-level C file descriptors. - -For most file objects you create in Python via the built-in ``file`` -constructor, ``f.close()`` marks the Python file object as being closed from -Python's point of view, and also arranges to close the underlying C stream. -This also happens automatically in ``f``'s destructor, when ``f`` becomes -garbage. - -But stdin, stdout and stderr are treated specially by Python, because of the -special status also given to them by C. Running ``sys.stdout.close()`` marks -the Python-level file object as being closed, but does *not* close the -associated C stream. - -To close the underlying C stream for one of these three, you should first be -sure that's what you really want to do (e.g., you may confuse extension modules -trying to do I/O). If it is, use os.close:: +sys.stdout (stdin, stderr) を閉じようとしても実際に閉じられないのはなぜです か? +------------------------------------------------------------------------------- + +Python のファイルオブジェクトは、 +(ここで説明する中では) 低レベルな C ファイルディスクリプタの上にある、 +中レベルな抽象のレイヤである C ストリームのそのまた上にある、 +高レベルな抽象のレイヤです。 + +組み込みの ``open`` 関数によって生成されたほとんどの +ファイルオブジェクトでは、\ ``f.close()`` は Python ファイルオブジェクトが +Python の視点からは閉じられているものとする印をつけ、その下にある +C ファイルディスクリプタを閉じるように手配します。これは、\ ``f`` が +ガベージとなったときにも、\ ``f`` のデストラクタで自動的に起こります。 + +しかし、stdin、stdout、stderr は C で特別な立場が与えられていることから、 +Python でも同様に特別に扱われます。\ ``sys.stdout.close()`` を実行すると、 +Python レベルのファイルオブジェクトには閉じられているものとする印が +つけられますが、C ファイルディスクリプタは *閉じられません*\ 。 + +下にある C ファイルディスクリプタのうち、この三つのどれかを閉じるには、 +まず本当に閉じる必要があることを確かめるべきです (例えば、拡張モジュールの +I/O を混乱させてしまうかもしれません)。本当に必要ならば、 +``os.close`` を使ってください:: os.close(0) # close C's stdin stream os.close(1) # close C's stdout stream os.close(2) # close C's stderr stream -Network/Internet Programming -============================ - -What WWW tools are there for Python? ------------------------------------- - -See the chapters titled :ref:`internet` and :ref:`netdata` in the Library -Reference Manual. Python has many modules that will help you build server-side -and client-side web systems. +ネットワーク/インターネットプログラミング +========================================= + +Python の WWW ツールには何がありますか? +---------------------------------------- + +ライブラリリファレンスマニュアルの :ref:`internet` と :ref:`netdata` と +いう章を参照してください。 .. XXX check if wiki page is still up to date -A summary of available frameworks is maintained by Paul Boddie at -http://wiki.python.org/moin/WebProgramming . - -Cameron Laird maintains a useful set of pages about Python web technologies at -http://phaseit.net/claird/comp.lang.python/web_python. +http://wiki.python.org/moin/WebProgramming で利用可能な +フレームワークの概要が Paul Boddie によって整備されています。 + +Cameron Laird は、\ http://phaseit.net/claird/comp.lang.python/web_python で +Python のウェブ技術に関する便利なページ群を整備しています。 -How can I mimic CGI form submission (METHOD=POST)? --------------------------------------------------- - -I would like to retrieve web pages that are the result of POSTing a form. Is -there existing code that would let me do this easily? - -Yes. Here's a simple example that uses httplib:: +CGI フォームの発信 (METHOD=POST) を模倣するにはどうしますか? +------------------------------------------------------------- + +フォームを POST した結果のウェブページを取得したいです。 +簡単に取得するためのコードはあるでしょうか? + +あります。これは urllib.request を利用した簡単な例です:: #!/usr/local/bin/python @@ -672,10 +677,13 @@ if reply != 200: sys.stdout.write(httpobj.getfile().read()) -Note that in general for URL-encoded POST operations, query strings must be -quoted by using :func:`urllib.quote`. For example to send name="Guy Steele, -Jr.":: - +なお、一般にパーセントエンコードされた POST 演算では、クエリ文字列は必ず +:func:`urllib.parse.urlencode` で引用されなくてはなりません。 +例えば name="Guy Steele, Jr." を送信するには:: + + >>> import urllib.parse + >>> urllib.parse.urlencode({'name': 'Guy Steele, Jr.'}) + 'name=Guy+Steele%2C+Jr.' >>> from urllib import quote >>> x = quote("Guy Steele, Jr.") >>> x @@ -685,39 +693,39 @@ 'name=Guy%20Steele,%20Jr.' ***The diff for this file has been truncated for email.*** ======================================= --- /faq/programming.rst Sat Mar 19 08:59:41 2011 +++ /faq/programming.rst Tue Nov 8 12:38:17 2011 @@ -1,234 +1,231 @@ :tocdepth: 2 -=============== -Programming FAQ -=============== +=================== +プログラミング FAQ +=================== .. contents:: -General Questions -================= - -Is there a source code level debugger with breakpoints, single-stepping, etc.? ------------------------------------------------------------------------------- - -Yes. - -The pdb module is a simple but adequate console-mode debugger for Python. It is -part of the standard Python library, and is :mod:`documented in the Library -Reference Manual <pdb>`. You can also write your own debugger by using the code -for pdb as an example. - -The IDLE interactive development environment, which is part of the standard -Python distribution (normally available as Tools/scripts/idle), includes a -graphical debugger. There is documentation for the IDLE debugger at -http://www.python.org/idle/doc/idle2.html#Debugger. - -PythonWin is a Python IDE that includes a GUI debugger based on pdb. The -Pythonwin debugger colors breakpoints and has quite a few cool features such as -debugging non-Pythonwin programs. Pythonwin is available as part of the `Python -for Windows Extensions <http://sourceforge.net/projects/pywin32/>`__ project and -as a part of the ActivePython distribution (see -http://www.activestate.com/Products/ActivePython/index.html). - -`Boa Constructor <http://boa-constructor.sourceforge.net/>`_ is an IDE and GUI -builder that uses wxWidgets. It offers visual frame creation and manipulation, -an object inspector, many views on the source like object browsers, inheritance -hierarchies, doc string generated html documentation, an advanced debugger, -integrated help, and Zope support. - -`Eric <http://www.die-offenbachs.de/eric/index.html>`_ is an IDE built on PyQt -and the Scintilla editing component. - -Pydb is a version of the standard Python debugger pdb, modified for use with DDD -(Data Display Debugger), a popular graphical debugger front end. Pydb can be -found at http://bashdb.sourceforge.net/pydb/ and DDD can be found at -http://www.gnu.org/software/ddd. - -There are a number of commercial Python IDEs that include graphical debuggers. -They include: +一般的な質問 +============ + +ブレークポイントやシングルステップ実行などを備えたソースコードレベルデバッ ガはありますか? +------------------------------------------------------------------------------------------ + +はい。 + +pdb モジュールは簡素にして十分な Python のコンソールモードデバッガです。 +これは Python の標準ライブラリに含まれているもので、 +:mod:`ライブラリリファレンスマニュアルにドキュメントがあります <pdb>`\ 。 +pdb のコードを手本にして自分用のデバッガを書くこともできます。 + +Python に同梱されている統合開発環境の IDLE は 通常の Python の +配布形態の一部 (普通は Tools/scripts/idle から利用可能) であり、 +グラフィカルなデバッガを含んでいます。IDLE デバッガのドキュメントは +http://www.python.org/idle/doc/idle2.html#Debugger にあります。 + +PythonWin は、pdb をベースとした GUI デバッガを含む Python IDE です。 +Pythonwin デバッガは、ブレークポイントの色付けや非 Pythonwin プログラムの +デバッグなどのたくさんの素敵な機能を持っています。Pythonwin は `Python +for Windows Extensions <http://sourceforge.net/projects/pywin32/>`__ +プロジェクトの一部、あるいは ActivePython ディストリビューション +(http://www.activestate.com/Products/ActivePython/index.html を参照) の +一部として利用可能です。 + +`Boa Constructor <http://boa-constructor.sourceforge.net/>`_ は、 +wxWidgets を使った IDE と GUI ビルダーです。これは視覚フレームの作成と操 作、 +オブジェクト検査、オブジェクトブラウザのような多くのビュー、継承構造、 +doc string から生成される html ドキュメント、高度なデバッガ、総合ヘルプ、 +Zope のサポートを提供します。 + +`Eric <http://www.die-offenbachs.de/eric/index.html>`_ は +PyQt や Scintilla editing component をもとにした IDE です。 + +Pydb は標準のデバッガである pdb を人気のグラフィカルデバッガ +フロントエンドである DDD (Data Display Debugger) とともに使うために +改変したものです。Pydb は http://bashdb.sourceforge.net/pydb/ に、 +DDD は http://www.gnu.org/software/ddd にあります。 + +商業のグラフィカルデバッガ付き Python IDE もあります。例えば: * Wing IDE (http://wingware.com/) * Komodo IDE (http://www.activestate.com/Products/Komodo) -Is there a tool to help find bugs or perform static analysis? -------------------------------------------------------------- - -Yes. - -PyChecker is a static analysis tool that finds bugs in Python source code and -warns about code complexity and style. You can get PyChecker from -http://pychecker.sf.net. - -`Pylint <http://www.logilab.org/projects/pylint>`_ is another tool that checks -if a module satisfies a coding standard, and also makes it possible to write -plug-ins to add a custom feature. In addition to the bug checking that -PyChecker performs, Pylint offers some additional features such as checking line -length, whether variable names are well-formed according to your coding -standard, whether declared interfaces are fully implemented, and more. -http://www.logilab.org/card/pylint_manual provides a full list of Pylint's -features. +バグの発見や静的分析に役立つツールはありますか? +------------------------------------------------ + +はい。 + +PyChecker は Python ソースコードのバグを発見しコードの複雑さと +スタイルについて警告する静的解析ツールです。PyChecker は +http://pychecker.sf.net から手に入ります。 + +`Pylint <http://www.logilab.org/projects/pylint>`_ は、モジュールが +コーディング標準を満たすかを調べ、プラグインを書いてカスタム機能を +加えられるようにするツールです。PyChecker が行うバグチェックに加え、 +Pylint は行の長さ、変数名が一貫しているか、宣言されたインタフェースが完全に +実装されているか、などを確かめる追加の機能を提供します。 +http://www.logilab.org/card/pylint_manual から Pylint の機能の一覧を +見られます。 -How can I create a stand-alone binary from a Python script? ------------------------------------------------------------ - -You don't need the ability to compile Python to C code if all you want is a -stand-alone program that users can download and run without having to install -the Python distribution first. There are a number of tools that determine the -set of modules required by a program and bind these modules together with a -Python binary to produce a single executable. - -One is to use the freeze tool, which is included in the Python source tree as -``Tools/freeze``. It converts Python byte code to C arrays; a C compiler you can -embed all your modules into a new program, which is then linked with the -standard Python modules. - -It works by scanning your source recursively for import statements (in both -forms) and looking for the modules in the standard Python path as well as in the -source directory (for built-in modules). It then turns the bytecode for modules -written in Python into C code (array initializers that can be turned into code -objects using the marshal module) and creates a custom-made config file that -only contains those built-in modules which are actually used in the program. It -then compiles the generated C code and links it with the rest of the Python -interpreter to form a self-contained binary which acts exactly like your script. - -Obviously, freeze requires a C compiler. There are several other utilities -which don't. One is Thomas Heller's py2exe (Windows only) at +どうしたら Python スクリプトからスタンドアロンバイナリを作れますか? +-------------------------------------------------------------------- + +ユーザがダウンロードや起動のために Python ディストリビューションを +インストールしなくてもよいスタンドアロンプログラムのためだけなら、 +Python を C コードにコンパイルできる必要はありません。プログラムに対して +必要なモジュールを選び、そのモジュールを Python バイナリに束縛して +一つの実行可能ファイルにまとめる多くのツールがあります。 + +一つは freeze ツールで、Python ソースツリーに ``Tools/freeze`` として +含まれています。これは Python バイトコードを C 配列に変換します。 +すべてのモジュールを標準 Python モジュールにリンクされる新しいプログラムに +埋め込む C コンパイラです。 + +これはあなたのソースの (両方の形式の) import 文を再帰的にスキャンして、 +import されたモジュールを標準の Python パスと (組み込みモジュールのある) +ソースディレクトリから探します。そして Python で書かれたモジュールの +バイトコードを C コード (marshal モジュールでコードオブジェクトに +変換できる配列) に変換し、実際にそのプログラム内で使われている +組み込みモジュールだけが含まれたカスタムメイドの設定ファイルを作成します。 +そして生成された C コードをコンパイルして Python インタプリタの残りとリンク し、 +元のスクリプトと全く同じように動作する自己充足的なバイナリを形成します。 + +もちろん、凍結には C コンパイラが必要です。C コンパイラを必要としない +選択肢もあります。その一つは、Thomas Heller の py2exe (Windows 専用) です。 http://www.py2exe.org/ -Another is Christian Tismer's `SQFREEZE <http://starship.python.net/crew/pirx>`_ -which appends the byte code to a specially-prepared Python interpreter that can -find the byte code in the executable. - -Other tools include Fredrik Lundh's `Squeeze -<http://www.pythonware.com/products/python/squeeze>`_ and Anthony Tuininga's -`cx_Freeze <http://starship.python.net/crew/atuining/cx_Freeze/index.html>`_. +他に、 Christian Tismer の `SQFREEZE <http://starship.python.net/crew/pirx>`_ +は、実行可能ファイルのバイトコードを探すことができる特別な Python +インタプリタにバイトコードを加えます。 + +その他のツールには、Fredrik Lundh の `Squeeze +<http://www.pythonware.com/products/python/squeeze>`_ や Anthony Tuininga の +`cx_Freeze <http://starship.python.net/crew/atuining/cx_Freeze/index.html>`_ +などがあります。 -Are there coding standards or a style guide for Python programs? ----------------------------------------------------------------- - -Yes. The coding style required for standard library modules is documented as -:pep:`8`. +Python プログラムのためのコーディングスタンダードやスタイルガイドはあります か? +------------------------------------------------------------------------------- + +はい。標準ライブラリモジュールに求められるコーディングスタイルは :pep:`8` +として文書化されています。 -My program is too slow. How do I speed it up? ---------------------------------------------- - -That's a tough one, in general. There are many tricks to speed up Python code; -consider rewriting parts in C as a last resort. - -In some cases it's possible to automatically translate Python to C or x86 -assembly language, meaning that you don't have to modify your code to gain -increased speed. +プログラムが遅すぎます。どうしたら速くなりますか? +-------------------------------------------------- + +一般に、それは難しい質問です。Python コードを速くするためには、いろいろな +手法があります。最終手段として一部を C で書き直す事も考えてください。 + +Python を自動的に C や x86 アセンブリ言語に変換できる場合もあります。 +この場合、速度を上げるためにコードを変更する必要はありません。 .. XXX seems to have overlap with other questions! -`Pyrex <http://www.cosc.canterbury.ac.nz/~greg/python/Pyrex/>`_ can compile a -slightly modified version of Python code into a C extension, and can be used on -many different platforms. - -`Psyco <http://psyco.sourceforge.net>`_ is a just-in-time compiler that -translates Python code into x86 assembly language. If you can use it, Psyco can -provide dramatic speedups for critical functions. - -The rest of this answer will discuss various tricks for squeezing a bit more -speed out of Python code. *Never* apply any optimization tricks unless you know -you need them, after profiling has indicated that a particular function is the -heavily executed hot spot in the code. Optimizations almost always make the -code less clear, and you shouldn't pay the costs of reduced clarity (increased -development time, greater likelihood of bugs) unless the resulting performance -benefit is worth it. - -There is a page on the wiki devoted to `performance tips -<http://wiki.python.org/moin/PythonSpeed/PerformanceTips>`_. - -Guido van Rossum has written up an anecdote related to optimization at -http://www.python.org/doc/essays/list2str.html. - -One thing to notice is that function and (especially) method calls are rather -expensive; if you have designed a purely OO interface with lots of tiny -functions that don't do much more than get or set an instance variable or call -another method, you might consider using a more direct way such as directly -accessing instance variables. Also see the standard module :mod:`profile` which -makes it possible to find out where your program is spending most of its time -(if you have some patience -- the profiling itself can slow your program down by -an order of magnitude). - -Remember that many standard optimization heuristics you may know from other -programming experience may well apply to Python. For example it may be faster -to send output to output devices using larger writes rather than smaller ones in -order to reduce the overhead of kernel system calls. Thus CGI scripts that -write all output in "one shot" may be faster than those that write lots of small -pieces of output. - -Also, be sure to use Python's core features where appropriate. For example, -slicing allows programs to chop up lists and other sequence objects in a single -tick of the interpreter's mainloop using highly optimized C implementations. -Thus to get the same effect as:: +`Pyrex <http://www.cosc.canterbury.ac.nz/~greg/python/Pyrex/>`_ は +Python コードの少し変化した版を C 拡張にコンパイルでき、 +多様なプラットフォームで使えます。 + +`Psyco <http://psyco.sourceforge.net>`_ は Python コードを x86 アセンブリ言 語に +変換する実行時コンパイラです。これを使うことが出来れば、 +重要な関数を劇的にスピードアップできます。 + +あとは、Python コードからもう少し速度を搾り出すための様々な手法について +議論することになります。コード中の特定の関数が処理が集中するホットスポット で、 +最適化が必要であると認められない限り、\ *決して* いかなる最適化の手法も +使わないでください。最適化はたいていコードを分かりづらくするので、 +分かりづらさのコスト (開発時間の延長とバグの可能性の増大) がそれに +見合ったパフォーマンスの向上につながらないのであれば元が取れません。 + +`performance tips <http://wiki.python.org/moin/PythonSpeed/PerformanceTips>`_ +に関するページが wiki にあります。 + +Guido van Rossum は http://www.python.org/doc/essays/list2str.html で +最適化に関する逸話を詳述しています。 + +なお、関数や(特に)メソッドの呼び出しはかなり高価です。インスタンス変数を +get や set したり他のメソッドを呼び出す程度の小さな関数がたくさんある +純粋 OO インタフェースをデザインしているなら、インスタンス変数に +直接アクセスするようなもっと直接的な方法も考えてみてください。また、 +どのプログラムが実行時間の大部分を占めているかを見つける標準モジュール +:mod:`profile` も参照してください (ちょっと忍耐できればの話ですが - +プロファイリングはそれ自体がプログラムを一桁ほど遅くしてしまいます)。 + +もちろん、他のプログラミングの経験から得られた多くの標準的な最適化の +発見的手法は Python にもよく当てはまることが多いです。たとえば、出力装置に +出力を送るときに、一度に少なく書くよりもむしろ多く書いたほうが、カーネルの +システムコールのオーバーヘッドを減らすことができて、速くなるでしょう。 +したがって、CGI スクリプトは "一発" ですべて書き出すもののほうが小さな +たくさんの出力に分けて書き出すものよりも速くなるでしょう。 + +また、必ず Python のコアな機能を適切に使ってください。例えば、 +スライシングなら、リストや他のシーケンスオブジェクトを、高度に最適化された +C 実装で、インタプリタのメインループの一刻みで細切れにできます。 +こうして効果を得ることができる例は:: L2 = [] for i in range[3]: L2.append(L1[i]) -it is much shorter and far faster to use :: +こう使えばずっと短く、ずっと速くできます:: L2 = list(L1[:3]) # "list" is redundant if L1 is a list. -Note that the functionally-oriented built-in functions such as :func:`map`, -:func:`zip`, and friends can be a convenient accelerator for loops that -perform a single task. For example to pair the elements of two lists -together:: +関数指向組み込み関数 :func:`map` や :func:`zip` なども一つのタスクを +実行するためのループを加速するのに便利であることに注意してください。 +例えば、二つのリストの要素を組み合わせるためには:: >>> zip([1, 2, 3], [4, 5, 6]) [(1, 4), (2, 5), (3, 6)] -or to compute a number of sines:: +また、正弦を一度に計算するには:: >>> map(math.sin, (1, 2, 3, 4)) [0.841470984808, 0.909297426826, 0.14112000806, -0.756802495308] -The operation completes very quickly in such cases. - -Other examples include the ``join()`` and ``split()`` :ref:`methods -of string objects <string-methods>`. -For example if s1..s7 are large (10K+) strings then -``"".join([s1,s2,s3,s4,s5,s6,s7])`` may be far faster than the more obvious -``s1+s2+s3+s4+s5+s6+s7``, since the "summation" will compute many -subexpressions, whereas ``join()`` does all the copying in one pass. For -manipulating strings, use the ``replace()`` and the ``format()`` :ref:`methods -on string objects <string-methods>`. Use regular expressions only when you're -not dealing with constant string patterns. You may still use :ref:`the old % -operations <string-formatting>` ``string % tuple`` and ``string % dictionary``. - -Be sure to use the :meth:`list.sort` built-in method to do sorting, and see the -`sorting mini-HOWTO <http://wiki.python.org/moin/HowTo/Sorting>`_ for examples -of moderately advanced usage. :meth:`list.sort` beats other techniques for -sorting in all but the most extreme circumstances. - -Another common trick is to "push loops into functions or methods." For example -suppose you have a program that runs slowly and you use the profiler to -determine that a Python function ``ff()`` is being called lots of times. If you -notice that ``ff()``:: +このような場合には素早く演算が完了します。 + +その他の例には、\ :ref:`文字列オブジェクトのメソッド <string-methods>` +``join()`` 、\ ``split()`` などが挙げられます。 + +例えば s1..s7 が大きな (10K+) 文字列の時、\ ``"".join([s1,s2,s3,s4,s5,s6,s7])`` +は単純に ``s1+s2+s3+s4+s5+s6+s7`` とするよりもはるかに速くなるでしょう。 +なぜなら、\ ``join()`` はすべてのコピーを一括して行うのに対し、 +「足し算」が多くの副演算を行うからです。文字列を扱うには、 +:ref:`文字列オブジェクトのメソッド <string-methods>` ``replace()``\ 、 +``format()`` を使ってください。正規表現を使うのは、 +決まった文字列のパターンを使わない時だけにしてください。 +:ref:`旧式の % 演算 <string-formatting>` ``string % tuple`` と +``string % dictionary`` も使えます。 + +ソートには必ずビルトインオブジェクトの :meth:`list.sort` を使ってください。 +また、\ `sorting mini-HOWTO <http://wiki.python.org/moin/HowTo/Sorting>`_ の +少し高度な使い方の例を参照してください。\ :meth:`list.sort` は、 +よほど極端な状況でない限り、他のソートの技術に勝ります。 + +「ループを関数やメソッドの中に入れ込む」というのも一般的な手法です。例え ば、 +遅いプログラムがあって、Python の ``ff()`` 関数が何度も呼ばれていることが +プロファイラで分かったとします。もし、\ ``ff()``:: def ff(x): ... # do something with x computing result... return result -tends to be called in loops like:: +が:: list = map(ff, oldlist) -or:: +または:: for x in sequence: value = ff(x) ... # do something with value... -then you can often eliminate function call overhead by rewriting ``ff()`` to:: +のようにループの中で呼ばれていることが多いなら、\ ``ff()`` を:: def ffseq(seq): resultseq = [] @@ -237,56 +234,55 @@ resultseq.append(result) return resultseq -and rewrite the two examples to ``list = ffseq(oldlist)`` and to:: +のように、また、上の二つの例を、\ ``list = ffseq(oldlist)`` と:: for value in ffseq(sequence): ... # do something with value... -Single calls to ``ff(x)`` translate to ``ffseq([x])[0]`` with little penalty. -Of course this technique is not always appropriate and there are other variants -which you can figure out. - -You can gain some performance by explicitly storing the results of a function or -method lookup into a local variable. A loop like:: +のように書き換えることによって、関数を呼ぶためのオーバーヘッドを省けること が多いです。 + +``ff(x)`` を一回だけ呼ぶ場合、 ``ffseq([x])[0]`` に直してしまうとちょっと +不利になります。 もちろん、このテクニックがいつでも適切であるわけでは +ありませんし、解決のための他の方法もあります。 + +関数やメソッドの探索の結果をローカル変数に明示的に保存すると少し +パフォーマンスが良くなります。次のようなループ:: for key in token: dict[key] = dict.get(key, 0) + 1 -resolves ``dict.get`` every iteration. If the method isn't going to change, a -slightly faster implementation is:: +は、繰り返しのたびに ``dict.get`` を求めています。 このメソッドが +変わることがないのなら、少し速い実装は:: dict_get = dict.get # look up the method once for key in token: dict[key] = dict_get(key, 0) + 1 -Default arguments can be used to determine values once, at compile time instead -of at run time. This can only be done for functions or objects which will not -be changed during program execution, such as replacing :: +デフォルト引数は、実行時でなく、コンパイル時に値を一回で決めてしまうのに +使えます。これは、プログラムの実行中に変化しない関数やオブジェクト、例え ば:: def degree_sin(deg): return math.sin(deg * math.pi / 180.0) -with :: +を、次のように置き換えるときにのみ行えます:: def degree_sin(deg, factor=math.pi/180.0, sin=math.sin): return sin(deg * factor) -Because this trick uses default arguments for terms which should not be changed, -it should only be used when you are not concerned with presenting a possibly -confusing API to your users. +この手法はデフォルト引数が変えられないことを前提に使うので、 +ユーザーが API で混乱するおそれがないときのみ使えます。 -Core Language -============= - -Why am I getting an UnboundLocalError when the variable has a value? --------------------------------------------------------------------- - -It can be a surprise to get the UnboundLocalError in previously working -code when it is modified by adding an assignment statement somewhere in -the body of a function. - -This code: +コア言語 +======== + +なぜ変数に値があるのに UnboundLocalError が出るのですか? +--------------------------------------------------------- + +もともと動いていたコードが、関数の本体のどこかに代入文を加えるという +変更をしたら UnboundLocalError を出すのには驚くかもしれません。 + +このコード:: >>> x = 10 >>> def bar(): @@ -294,29 +290,27 @@ >>> bar() 10 -works, but this code: +は動きますが、このコード:: >>> x = 10 >>> def foo(): ... print x ... x += 1 -results in an UnboundLocalError: +は UnboundLocalError になります:: >>> foo() Traceback (most recent call last): ... UnboundLocalError: local variable 'x' referenced before assignment -This is because when you make an assignment to a variable in a scope, that -variable becomes local to that scope and shadows any similarly named variable -in the outer scope. Since the last statement in foo assigns a new value to -``x``, the compiler recognizes it as a local variable. Consequently when the -earlier ``print x`` attempts to print the uninitialized local variable and -an error results. - -In the example above you can access the outer scope variable by declaring it -global: +これは、あるスコープの中で変数に代入を行うとき、その変数はそのスコープに +対してローカルになり、外のスコープにある同じ名前の変数を隠すからです。 +foo の最後の文が ``x`` に新しい値を代入しているので、コンパイラはこれを +ローカル変数であると認識します。その結果、先の ``print x`` が +初期化されていないローカル変数を表示しようとして結果はエラーとなります。 + +上の例では、グローバルであると宣言することで外のスコープにアクセスできま す:: >>> x = 10 >>> def foobar(): @@ -326,40 +320,39 @@ >>> foobar() 10 -This explicit declaration is required in order to remind you that (unlike the -superficially analogous situation with class and instance variables) you are -actually modifying the value of the variable in the outer scope: +この明示的な宣言は (表面的には似ているクラスとインスタンス変数の例とは違っ て) +あなたは実際は他のスコープの変数の値を変えようとしているのだ、 +ということを知らせるのに必要です:: >>> print x 11 -What are the rules for local and global variables in Python? ------------------------------------------------------------- - -In Python, variables that are only referenced inside a function are implicitly -global. If a variable is assigned a new value anywhere within the function's -body, it's assumed to be a local. If a variable is ever assigned a new value -inside the function, the variable is implicitly local, and you need to -explicitly declare it as 'global'. - -Though a bit surprising at first, a moment's consideration explains this. On -one hand, requiring :keyword:`global` for assigned variables provides a bar -against unintended side-effects. On the other hand, if ``global`` was required -for all global references, you'd be using ``global`` all the time. You'd have -to declare as global every reference to a built-in function or to a component of -an imported module. This clutter would defeat the usefulness of the ``global`` -declaration for identifying side-effects. +Python のローカルとグローバル変数のルールは何ですか? +----------------------------------------------------- + +Python では、関数の中で参照のみされる変数は暗黙のうちにグローバルになりま す。 +関数の本体のどこかで新しい値が変数に代入されたなら、それはローカルであると +みなされます。関数の中で新しい値が一度でも代入されたらその変数は +暗黙のうちにローカルであり、'global' は明示的に宣言しなければなりません。 + +最初はちょっと驚くでしょうが、少し考えると納得できます。一方では、 +代入された変数に :keyword:`global` を要求することで、意図しない副作用を +防げます。他方では、グローバルな参照の度に ``global`` が要求されてしまう と、 +``global`` を使ってばかりになってしまいます。ビルトイン関数やインポートされ た +モジュールの内容を参照するたびにグローバル宣言をしなければならないのです。 +その乱雑さは副作用を特定するための ``global`` 宣言の便利さよりも重大です。 -How do I share global variables across modules? ------------------------------------------------- - -The canonical way to share information across modules within a single program is -to create a special module (often called config or cfg). Just import the config -module in all modules of your application; the module then becomes available as -a global name. Because there is only one instance of each module, any changes -made to the module object get reflected everywhere. For example: +グローバル変数をモジュール間で共有するにはどうしたらいいですか? +---------------------------------------------------------------- + +一つのプログラムのモジュール間で情報を共有する正準な方法は、 +特別なモジュール (しばしば config や cfg と呼ばれる) を作ることです。 +単に設定モジュールをアプリケーションのすべてのモジュールに +インポートしてください。このモジュールはグローバルな名前として使えます。 +それぞれのモジュールのただ一つのインスタンスがあるので、 +設定モジュールオブジェクトに対するいかなる変更も全体に反映されます。例えば: config.py:: @@ -376,82 +369,85 @@ import mod print config.x -Note that using a module is also the basis for implementing the Singleton design -pattern, for the same reason. +なお、同じ理由から、モジュールを使うということは、 +シングルトンデザインパターンを実装することの基礎でもあります。 -What are the "best practices" for using import in a module? ------------------------------------------------------------ - -In general, don't use ``from modulename import *``. Doing so clutters the -importer's namespace. Some people avoid this idiom even with the few modules -that were designed to be imported in this manner. Modules designed in this -manner include :mod:`Tkinter`, and :mod:`threading`. - -Import modules at the top of a file. Doing so makes it clear what other modules -your code requires and avoids questions of whether the module name is in scope. -Using one import per line makes it easy to add and delete module imports, but -using multiple imports per line uses less screen space. - -It's good practice if you import modules in the following order: - -1. standard library modules -- e.g. ``sys``, ``os``, ``getopt``, ``re`` -2. third-party library modules (anything installed in Python's site-packages - directory) -- e.g. mx.DateTime, ZODB, PIL.Image, etc. -3. locally-developed modules - -Never use relative package imports. If you're writing code that's in the -``package.sub.m1`` module and want to import ``package.sub.m2``, do not just -write ``import m2``, even though it's legal. Write ``from package.sub import -m2`` instead. Relative imports can lead to a module being initialized twice, -leading to confusing bugs. See :pep:`328` for details. - -It is sometimes necessary to move imports to a function or class to avoid -problems with circular imports. Gordon McMillan says: - - Circular imports are fine where both modules use the "import <module>" form - of import. They fail when the 2nd module wants to grab a name out of the - first ("from module import name") and the import is at the top level. That's - because names in the 1st are not yet available, because the first module is - busy importing the 2nd. - -In this case, if the second module is only used in one function, then the import -can easily be moved into that function. By the time the import is called, the -first module will have finished initializing, and the second module can do its -import. - -It may also be necessary to move imports out of the top level of code if some of -the modules are platform-specific. In that case, it may not even be possible to -import all of the modules at the top of the file. In this case, importing the -correct modules in the corresponding platform-specific code is a good option. - -Only move imports into a local scope, such as inside a function definition, if -it's necessary to solve a problem such as avoiding a circular import or are -trying to reduce the initialization time of a module. This technique is -especially helpful if many of the imports are unnecessary depending on how the -program executes. You may also want to move imports into a function if the -modules are only ever used in that function. Note that loading a module the -first time may be expensive because of the one time initialization of the -module, but loading a module multiple times is virtually free, costing only a -couple of dictionary lookups. Even if the module name has gone out of scope, -the module is probably available in :data:`sys.modules`. - -If only instances of a specific class use a module, then it is reasonable to -import the module in the class's ``__init__`` method and then assign the module -to an instance variable so that the module is always available (via that -instance variable) during the life of the object. Note that to delay an import -until the class is instantiated, the import must be inside a method. Putting -the import inside the class but outside of any method still causes the import to -occur when the module is initialized. +モジュールで import を使う際の「ベストプラクティス」は何ですか? +---------------------------------------------------------------- + +一般に、\ ``from modulename import *`` を使わないでください。使うとインポー タの +名前空間を混乱させてしまいます。この書式でインポートされるように設計された +数少ないモジュールにすらこの構文を使わないようにする人もいます。 +そのように設計されたモジュールには :mod:`Tkinter` や :mod:`threading` など が +あります。 + +モジュールはファイルの先頭でインポートしてください。これによってコードが +必要とする他のモジュールが明確になり、モジュール名がスコープに +含まれるかどうかに迷わなくなります。行に一つのインポートにすると、 +モジュールのインポートの追加と削除が容易になりますが、行に複数の +インポートにすると画面の領域が少なく済みます。 + +次の手順でモジュールをインポートするのが、良いプラクティスになります: + +1. 標準ライブラリモジュール -- 例 ``sys``\ 、\ ``os``\ 、\ ``getopt``\ 、\ ``re`` +2. サードパーティのライブラリモジュール (Python の site-packages + ディレクトリにあるもの) -- 例 mx.DateTime、ZODB、PIL.Image、など +3. 内部で開発したモジュール + +相対インポートは決して使わないでください。\ ``package.sub.m1`` モジュールの +コードを書いていて、\ ``package.sub.m2`` をインポートしようとするとき、 +``from . import m2`` とだけ書くのは、違反ではありませんがやらないでくださ い。 +代わりに ``from package.sub import m2`` と書いてください。 +詳細は :pep:`328` を参照してください。 + +循環参照の問題を避けるために、インポートを関数やクラスに移すことが +必要なときもあります。Gordon McMillan によれば: + + 循環参照は両方のモジュールが "import <module>" 形式のインポートを + 使っていれば大丈夫です。二つ目のモジュールが最初のモジュールから名前を + 確保しようとして ("from module import name")、そのインポートがトップレベ ルに + あると駄目です。最初のモジュールが二つ目のモジュールをインポートするのに + 忙しくて、最初のモジュールの名前が利用可能になっていないからです。 + +この状況では、二つ目のモジュールが一つの関数の中でのみ使われているならば、 +そのインポートは簡単に関数の中に移せます。インポートが呼ばれたとき、 +最初のモジュールは初期化を完了していて、二つ目のモジュールは自分の +インポートをできます。 + +プラットフォーム依存のモジュールがあるときには、インポートをトップレベルの +外に動かすことも必要です。この場合、ファイルの先頭ではすべてのモジュールを +インポートすることさえできないかもしれません。この場合は、対応する +プラットフォームに合わせたコードで正しいモジュールをインポートすることを +選ぶと良いです。 + +循環参照の問題を避けたりモジュールの初期化にかかる時間を減らしたりしたいな ら、 +単にインポートを関数定義の中などのローカルなスコープに移してください。 +この手法は多くのインポートがプログラムがどのように実行されるかに依存しなく て +よいときに特に有効です。ある関数の中でのみモジュールが使われるのなら、 +インポートをその関数の中に移すことを考えてもいいでしょう。なお、モジュール を +読み込む最初の回はモジュールの初期化の時間のために高価になりえますが、 +複数回目にモジュールを読み込むのは事実上無料、辞書探索の数回のコストだけで +済みます。モジュール名がスコープから外れてさえ、そのモジュールはおそらく +:data:`sys.modules` から利用できるでしょう。 + +特定のクラスのインスタンスのみがあるモジュールを使っているなら、 +そのクラスの ``__init__`` メソッドでそのモジュールをインポートし、 +そこでインスタンス変数にそのモジュールを代入して、オブジェクトがある間 +そのモジュールがいつでも (インスタンス変数を経由して) 利用できるように +するのが合理的です。なお、インポートをクラスが初期化される時まで +先送りにするためには、インポートはメソッドの中にないといけません。 +インポートをクラスの中に入れてもメソッドの外に出してしまうと、 +そのインポートはモジュールの初期化の時になされてしまいます。 -How can I pass optional or keyword parameters from one function to another? ---------------------------------------------------------------------------- - -Collect the arguments using the ``*`` and ``**`` specifiers in the function's -parameter list; this gives you the positional arguments as a tuple and the -keyword arguments as a dictionary. You can then pass these arguments when -calling another function by using ``*`` and ``**``:: +オプションパラメタやキーワードパラメタを関数から関数へ渡すにはどうしたらい いですか? +------------------------------------------------------------------------------------ + +関数のパラメタリストに引数を ``*`` と ``**`` 指定子 (specifier) で +集めてください。そうすれば、固定引数をタプルとして、キーワード引数を +辞書として得られます。これで、他の関数を呼び出すときに ``*`` と ``**`` を +使ってそれらの引数を渡せます:: def f(x, *args, **kwargs): ... @@ -459,8 +455,8 @@ ... g(x, *args, **kwargs) -In the unlikely case that you care about Python versions older than 2.0, use -:func:`apply`:: +あまりありませんが、Python の 2.0 以前のバージョンを考慮するときは、 +代わりに :func:`apply` を使ってください:: def f(x, *args, **kwargs): ... @@ -469,15 +465,15 @@ apply(g, (x,)+args, kwargs) -How do I write a function with output parameters (call by reference)? ---------------------------------------------------------------------- - -Remember that arguments are passed by assignment in Python. Since assignment -just creates references to objects, there's no alias between an argument name in -the caller and callee, and so no call-by-reference per se. You can achieve the -desired effect in a number of ways. - -1) By returning a tuple of the results:: +パラメタを出力する関数 (参照渡し) はどのように書きますか? +---------------------------------------------------------- + +前提として、Python では引数は代入によって渡されます。代入はオブジェクトへの +参照を作るだけなので、呼び出し元と呼び出し先にある引数名の間にエイリアスは +ありませんし、参照渡しそれ自体はありません。望む効果を得るためには幾つかの +方法があります。 + +1) 結果のタプルを返すことによって:: def func2(a, b): a = 'new-value' # a and b are local names @@ -488,11 +484,11 @@ x, y = func2(x, y) print x, y # output: new-value 100 - This is almost always the clearest solution. - -2) By using global variables. This isn't thread-safe, and is not recommended. - -3) By passing a mutable (changeable in-place) object:: + これはたいてい一番明確な方法です。 + +2) グローバル変数を使って。これはスレッドセーフでないので、推奨されません。 + +3) ミュータブルな (インプレースに変更可能な) オブジェクトを渡すことによっ て:: def func1(a): a[0] = 'new-value' # 'a' references a mutable list @@ -502,7 +498,7 @@ func1(args) print args[0], args[1] # output: new-value 100 -4) By passing in a dictionary that gets mutated:: +4) 変更される辞書に渡すことによって:: def func3(args): args['a'] = 'new-value' # args is a mutable dictionary @@ -512,7 +508,7 @@ func3(args) print args['a'], args['b'] -5) Or bundle up values in a class instance:: +5) クラスインスタンスに値を同梱することによって:: class callByRef: def __init__(self, **args): @@ -528,24 +524,25 @@ print args.a, args.b - There's almost never a good reason to get this complicated. - -Your best choice is to return a tuple containing the multiple results. + このような複雑なことをする理由はめったに無いでしょう。 + +一番の選択は、複数の結果を含むタプルを返すことです。 -How do you make a higher order function in Python? --------------------------------------------------- - -You have two choices: you can use nested scopes or you can use callable objects. -For example, suppose you wanted to define ``linear(a,b)`` which returns a -function ``f(x)`` that computes the value ``a*x+b``. Using nested scopes:: +Python で高次関数はどのようにつくりますか? +------------------------------------------- + +二つの方法があります: ネストされたスコープを使う方法と、 +呼び出し可能オブジェクトを使う方法です。例えば、\ ``a*x+b`` の値を計算する +``f(x)`` 関数を返す ``linear(a,b)`` を定義したいとします。 +ネストされたスコープを使うと:: def linear(a, b): def result(x): return a * x + b return result -Or using a callable object:: +また、呼び出し可能オブジェクトを使うと:: class linear: @@ -555,22 +552,23 @@ def __call__(self, x): return self.a * x + self.b -In both cases, :: +どちらの場合でも:: taxes = linear(0.3, 2) -gives a callable object where ``taxes(10e6) == 0.3 * 10e6 + 2``. - -The callable object approach has the disadvantage that it is a bit slower and -results in slightly longer code. However, note that a collection of callables -can share their signature via inheritance:: +とすれば、\ ``taxes(10e6) == 0.3 * 10e6 + 2`` となるような +呼び出し可能オブジェクトを得られます。 + +呼び出し可能オブジェクトを使う方法は、少し遅くなり、わずかにコードが +長くなるという短所があります。ですが、継承を使ってコーラブル同士で +記号を共有することもできます:: class exponential(linear): # __init__ inherited def __call__(self, x): return self.a * (x ** self.b) -Object can encapsulate state for several methods:: +オブジェクトはいくつかのメソッドに状態をカプセル化できます:: class counter: @@ -588,41 +586,40 @@ count = counter() inc, dec, reset = count.up, count.down, count.set -Here ``inc()``, ``dec()`` and ``reset()`` act like functions which share the -same counting variable. +ここで、\ ``inc()``\ 、\ ``dec()`` 、\ ``reset()`` は同じカウント変数を +共有する関数のようにふるまいます。 -How do I copy an object in Python? ----------------------------------- - -In general, try :func:`copy.copy` or :func:`copy.deepcopy` for the general case. -Not all objects can be copied, but most can. - -Some objects can be copied more easily. Dictionaries have a :meth:`~dict.copy` -method:: +Python のオブジェクトはどのようにコピーしますか? +------------------------------------------------- + +一般的に、普通は :func:`copy.copy` や :func:`copy.deepcopy` を試してくださ い。 +何でもコピーできるとは限りませんが、たいていはできます。 + +もっと簡単にコピーできるオブジェクトもあります。辞書には :meth:`~dict.copy` +メソッドがあります:: newdict = olddict.copy() -Sequences can be copied by slicing:: +シーケンスはスライシングでコピーできます:: new_l = l[:] -How can I find the methods or attributes of an object? +オブジェクトのメソッドや属性はどのように見つけますか? ------------------------------------------------------ -For an instance x of a user-defined class, ``dir(x)`` returns an alphabetized -list of the names containing the instance attributes and methods and attributes -defined by its class. +ユーザー定義クラスのインスタンス x で、\ ``dir(x)`` はインスタンス属性と +そのクラスで定義されたメソッドや属性を含む名前のアルファベット順リストを +返します。 -How can my code discover the name of an object? ------------------------------------------------ - -Generally speaking, it can't, because objects don't really have names. -Essentially, assignment always binds a name to a value; The same is true of -``def`` and ``class`` statements, but in that case the value is a -callable. Consider the following code:: +コードはどのようにオブジェクトの名前を見つけるのですか? +-------------------------------------------------------- + +概して、オブジェクトは本当は名前を持たないので、見つけることはできません。 +本質的には、代入とはいつも値に名前を束縛することです。\ ``def`` と ``class`` 文も +同じですが、この場合は値はコーラブルです。以下のコードを考えてみましょう:: class A: pass @@ -636,53 +633,52 @@ print a <__main__.A instance at 0x16D07CC> -Arguably the class has a name: even though it is bound to two names and invoked -through the name B the created instance is still reported as an instance of -class A. However, it is impossible to say whether the instance's name is a or -b, since both names are bound to the same value. - -Generally speaking it should not be necessary for your code to "know the names" -of particular values. Unless you are deliberately writing introspective -programs, this is usually an indication that a change of approach might be -beneficial. - -In comp.lang.python, Fredrik Lundh once gave an excellent analogy in answer to -this question: - - The same way as you get the name of that cat you found on your porch: the cat - (object) itself cannot tell you its name, and it doesn't really care -- so - the only way to find out what it's called is to ask all your neighbours - (namespaces) if it's their cat (object)... - - ....and don't be surprised if you'll find that it's known by many names, or - no name at all! +おそらく、このクラスには名前があります。このクラスは二つの名前に縛られて、 +名前 B を通して呼び出されますが、それでもクラス A のインスタンスとして +報告されるのです。しかし、両方の名前が同じ値に束縛されている以上、 +このインスタンスの名前が a か b か決めることはできないのです。 + +概して、コードにとってある値の「名前を知っている」事は重要ではありません。 +あなたがわざと内省的なコードを書いているのでない限り、 +方針を変えた方がいいかもしれないということになるでしょう。 + +comp.lang.python で、Fredrik Lundh はこの問題の答えとして素晴らしい喩えを +してくれました: + + 玄関にいた猫の名前を知るのと同じ方法です: その猫 (オブジェクト) 自体は + その名前を言うことができないし、それは実は問題ではありません -- + その猫が何と呼ばれているかを知る唯一の方法は、すべての隣人 (名前空間) に ***The diff for this file has been truncated for email.*** ============================================================================== Revision: 587ddff8daca Author: Arihiro TAKASE <hinac****@gmail*****> Date: Tue Nov 8 12:48:15 2011 Log: merge http://code.google.com/p/python-doc-ja/source/detail?r=587ddff8daca Deleted: /whatsnew/2.4.rst.diff /whatsnew/2.4.rst.diff.html /whatsnew/2.6.rst.diff /whatsnew/2.6.rst.diff.html /whatsnew/index.rst.diff /whatsnew/index.rst.diff.html ======================================= --- /whatsnew/2.4.rst.diff Sun Oct 30 17:04:23 2011 +++ /dev/null @@ -1,27 +0,0 @@ -@@ -1057,25 +1057,25 @@ - :func:`use_default_colors`. On platforms where the terminal supports - transparency, this makes it possible to use a transparent background. - (Contributed by Jörg Lehmann.) - - * The :mod:`difflib` module now includes an :class:`HtmlDiff` class that creates - an HTML table showing a side by side comparison of two versions of a text. - (Contributed by Dan Gass.) - - * The :mod:`email` package was updated to version 3.0, which dropped various - deprecated APIs and removes support for Python versions earlier than 2.3. The - 3.0 version of the package uses a new incremental parser for MIME messages, - available in the :mod:`email.FeedParser` module. The new parser doesn't require -- reading the entire message into memory, and doesn't throw exceptions if a -+ reading the entire message into memory, and doesn't raise exceptions if a - message is malformed; instead it records any problems in the :attr:`defect` - attribute of the message. (Developed by Anthony Baxter, Barry Warsaw, Thomas - Wouters, and others.) - - * The :mod:`heapq` module has been converted to C. The resulting tenfold - improvement in speed makes the module suitable for handling high volumes of - data. In addition, the module has two new functions :func:`nlargest` and - :func:`nsmallest` that use heaps to find the N largest or smallest values in a - dataset without the expense of a full sort. (Contributed by Raymond Hettinger.) - - * The :mod:`httplib` module now contains constants for HTTP status codes defined - in various HTTP-related RFC documents. Constants have names such as ======================================= --- /whatsnew/2.4.rst.diff.html Sun Oct 30 17:04:23 2011 +++ /dev/null @@ -1,101 +0,0 @@ -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> -<title>whatsnew/2.4.rst</title> -<style type="text/css"> -.highlight .hll { background-color: #ffffcc } -.highlight { background: #f8f8f8; } -.highlight .c { color: #408080; font-style: italic } /* Comment */ -.highlight .err { border: 1px solid #FF0000 } /* Error */ -.highlight .k { color: #008000; font-weight: bold } /* Keyword */ -.highlight .o { color: #666666 } /* Operator */ -.highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */ -.highlight .cp { color: #BC7A00 } /* Comment.Preproc */ -.highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */ -.highlight .cs { color: #408080; font-style: italic } /* Comment.Special */ -.highlight .gd { color: #A00000 } /* Generic.Deleted */ -.highlight .ge { font-style: italic } /* Generic.Emph */ -.highlight .gr { color: #FF0000 } /* Generic.Error */ -.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ -.highlight .gi { color: #00A000 } /* Generic.Inserted */ -.highlight .go { color: #808080 } /* Generic.Output */ -.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ -.highlight .gs { font-weight: bold } /* Generic.Strong */ -.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ -.highlight .gt { color: #0040D0 } /* Generic.Traceback */ -.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ -.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ -.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ -.highlight .kp { color: #008000 } /* Keyword.Pseudo */ -.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ -.highlight .kt { color: #B00040 } /* Keyword.Type */ -.highlight .m { color: #666666 } /* Literal.Number */ -.highlight .s { color: #BA2121 } /* Literal.String */ -.highlight .na { color: #7D9029 } /* Name.Attribute */ -.highlight .nb { color: #008000 } /* Name.Builtin */ -.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ -.highlight .no { color: #880000 } /* Name.Constant */ -.highlight .nd { color: #AA22FF } /* Name.Decorator */ -.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */ -.highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ -.highlight .nf { color: #0000FF } /* Name.Function */ -.highlight .nl { color: #A0A000 } /* Name.Label */ -.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ -.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ -.highlight .nv { color: #19177C } /* Name.Variable */ -.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ -.highlight .w { color: #bbbbbb } /* Text.Whitespace */ -.highlight .mf { color: #666666 } /* Literal.Number.Float */ -.highlight .mh { color: #666666 } /* Literal.Number.Hex */ -.highlight .mi { color: #666666 } /* Literal.Number.Integer */ -.highlight .mo { color: #666666 } /* Literal.Number.Oct */ -.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ -.highlight .sc { color: #BA2121 } /* Literal.String.Char */ -.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ -.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ -.highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ -.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ -.highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ -.highlight .sx { color: #008000 } /* Literal.String.Other */ -.highlight .sr { color: #BB6688 } /* Literal.String.Regex */ -.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ -.highlight .ss { color: #19177C } /* Literal.String.Symbol */ -.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ -.highlight .vc { color: #19177C } /* Name.Variable.Class */ -.highlight .vg { color: #19177C } /* Name.Variable.Global */ -.highlight .vi { color: #19177C } /* Name.Variable.Instance */ -.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ -</style> -</head> -<body> -<div class="highlight"><pre><span class="gu">@@ -1057,25 +1057,25 @@</span> - :func:`use_default_colors`. On platforms where the terminal supports - transparency, this makes it possible to use a transparent background. - (Contributed by Jörg Lehmann.) - - * The :mod:`difflib` module now includes an :class:`HtmlDiff` class that creates - an HTML table showing a side by side comparison of two versions of a text. - (Contributed by Dan Gass.) - - * The :mod:`email` package was updated to version 3.0, which dropped various - deprecated APIs and removes support for Python versions earlier than 2.3. The - 3.0 version of the package uses a new incremental parser for MIME messages, - available in the :mod:`email.FeedParser` module. The new parser doesn't require -<span class="gd">- reading the entire message into memory, and doesn't throw exceptions if a</span> -<span class="gi">+ reading the entire message into memory, and doesn't raise exceptions if a</span> - message is malformed; instead it records any problems in the :attr:`defect` - attribute of the message. (Developed by Anthony Baxter, Barry Warsaw, Thomas - Wouters, and others.) - - * The :mod:`heapq` module has been converted to C. The resulting tenfold - improvement in speed makes the module suitable for handling high volumes of - data. In addition, the module has two new functions :func:`nlargest` and - :func:`nsmallest` that use heaps to find the N largest or smallest values in a - dataset without the expense of a full sort. (Contributed by Raymond Hettinger.) - - * The :mod:`httplib` module now contains constants for HTTP status codes defined - in various HTTP-related RFC documents. Constants have names such as -</pre></div> - -</body> -</html> ======================================= --- /whatsnew/2.6.rst.diff Sun Oct 30 17:04:23 2011 +++ /dev/null @@ -1,86 +0,0 @@ -@@ -2983,51 +2983,24 @@ - * Python 2.6 can be built with Microsoft Visual Studio 2008 (version - 9.0), and this is the new default compiler. See the - :file:`PCbuild` directory for the build files. (Implemented by - Christian Heimes.) - - * On Mac OS X, Python 2.6 can be compiled as a 4-way universal build. - The :program:`configure` script - can take a :option:`--with-universal-archs=[32-bit|64-bit|all]` - switch, controlling whether the binaries are built for 32-bit - architectures (x86, PowerPC), 64-bit (x86-64 and PPC-64), or both. - (Contributed by Ronald Oussoren.) - --* A new function added in Python 2.6.6, :cfunc:`PySys_SetArgvEx`, sets -- the value of ``sys.argv`` and can optionally update ``sys.path`` to -- include the directory containing the script named by ``sys.argv[0]`` -- depending on the value of an *updatepath* parameter. -- -- This function was added to close a security hole for applications -- that embed Python. The old function, :cfunc:`PySys_SetArgv`, would -- always update ``sys.path``, and sometimes it would add the current -- directory. This meant that, if you ran an application embedding -- Python in a directory controlled by someone else, attackers could -- put a Trojan-horse module in the directory (say, a file named -- :file:`os.py`) that your application would then import and run. -- -- If you maintain a C/C++ application that embeds Python, check -- whether you're calling :cfunc:`PySys_SetArgv` and carefully consider -- whether the application should be using :cfunc:`PySys_SetArgvEx` -- with *updatepath* set to false. Note that using this function will -- break compatibility with Python versions 2.6.5 and earlier; if you -- have to continue working with earlier versions, you can leave -- the call to :cfunc:`PySys_SetArgv` alone and call -- ``PyRun_SimpleString("sys.path.pop(0)\n")`` afterwards to discard -- the first ``sys.path`` component. -- -- Security issue reported as `CVE-2008-5983 -- <http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-5983>`_; -- discussed in :issue:`5753`, and fixed by Antoine Pitrou. -- - * The BerkeleyDB module now has a C API object, available as - ``bsddb.db.api``. This object can be used by other C extensions - that wish to use the :mod:`bsddb` module for their own purposes. - (Contributed by Duncan Grisby.) - - * The new buffer interface, previously described in - `the PEP 3118 section <#pep-3118-revised-buffer-protocol>`__, - adds :cfunc:`PyObject_GetBuffer` and :cfunc:`PyBuffer_Release`, - as well as a few other functions. - - * Python's use of the C stdio library is now thread-safe, or at least - as thread-safe as the underlying library is. A long-standing potential -@@ -3312,33 +3285,24 @@ - when accessed using slicing or index access; having - :class:`Exception` behave like a tuple is being phased out. - - * (3.0-warning mode) inequality comparisons between two dictionaries - or two objects that don't implement comparison methods are reported - as warnings. ``dict1 == dict2`` still works, but ``dict1 < dict2`` - is being phased out. - - Comparisons between cells, which are an implementation detail of Python's - scoping rules, also cause warnings because such comparisons are forbidden - entirely in 3.0. - --For applications that embed Python: -- --* The :cfunc:`PySys_SetArgvEx` function was added in Python 2.6.6, -- letting applications close a security hole when the existing -- :cfunc:`PySys_SetArgv` function was used. Check whether you're -- calling :cfunc:`PySys_SetArgv` and carefully consider whether the -- application should be using :cfunc:`PySys_SetArgvEx` with -- *updatepath* set to false. -- - .. ====================================================================== - - - .. _26acks: - - Acknowledgements - ================ - - The author would like to thank the following people for offering - suggestions, corrections and assistance with various drafts of this - article: Georg Brandl, Steve Brown, Nick Coghlan, Ralph Corderoy, - Jim Jewett, Kent Johnson, Chris Lambacher, Martin Michlmayr, ======================================= --- /whatsnew/2.6.rst.diff.html Sun Oct 30 17:04:23 2011 +++ /dev/null @@ -1,160 +0,0 @@ -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> -<title>whatsnew/2.6.rst</title> -<style type="text/css"> -.highlight .hll { background-color: #ffffcc } -.highlight { background: #f8f8f8; } -.highlight .c { color: #408080; font-style: italic } /* Comment */ -.highlight .err { border: 1px solid #FF0000 } /* Error */ -.highlight .k { color: #008000; font-weight: bold } /* Keyword */ -.highlight .o { color: #666666 } /* Operator */ -.highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */ -.highlight .cp { color: #BC7A00 } /* Comment.Preproc */ -.highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */ -.highlight .cs { color: #408080; font-style: italic } /* Comment.Special */ -.highlight .gd { color: #A00000 } /* Generic.Deleted */ -.highlight .ge { font-style: italic } /* Generic.Emph */ -.highlight .gr { color: #FF0000 } /* Generic.Error */ -.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ -.highlight .gi { color: #00A000 } /* Generic.Inserted */ -.highlight .go { color: #808080 } /* Generic.Output */ -.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ -.highlight .gs { font-weight: bold } /* Generic.Strong */ -.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ -.highlight .gt { color: #0040D0 } /* Generic.Traceback */ -.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ -.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ -.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ -.highlight .kp { color: #008000 } /* Keyword.Pseudo */ -.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ -.highlight .kt { color: #B00040 } /* Keyword.Type */ -.highlight .m { color: #666666 } /* Literal.Number */ -.highlight .s { color: #BA2121 } /* Literal.String */ -.highlight .na { color: #7D9029 } /* Name.Attribute */ -.highlight .nb { color: #008000 } /* Name.Builtin */ -.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ -.highlight .no { color: #880000 } /* Name.Constant */ -.highlight .nd { color: #AA22FF } /* Name.Decorator */ -.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */ -.highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ -.highlight .nf { color: #0000FF } /* Name.Function */ -.highlight .nl { color: #A0A000 } /* Name.Label */ -.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ -.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ -.highlight .nv { color: #19177C } /* Name.Variable */ -.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ -.highlight .w { color: #bbbbbb } /* Text.Whitespace */ -.highlight .mf { color: #666666 } /* Literal.Number.Float */ -.highlight .mh { color: #666666 } /* Literal.Number.Hex */ -.highlight .mi { color: #666666 } /* Literal.Number.Integer */ -.highlight .mo { color: #666666 } /* Literal.Number.Oct */ -.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ -.highlight .sc { color: #BA2121 } /* Literal.String.Char */ -.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ -.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ -.highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ -.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ -.highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ -.highlight .sx { color: #008000 } /* Literal.String.Other */ -.highlight .sr { color: #BB6688 } /* Literal.String.Regex */ -.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ -.highlight .ss { color: #19177C } /* Literal.String.Symbol */ -.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ -.highlight .vc { color: #19177C } /* Name.Variable.Class */ -.highlight .vg { color: #19177C } /* Name.Variable.Global */ -.highlight .vi { color: #19177C } /* Name.Variable.Instance */ -.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ -</style> -</head> -<body> -<div class="highlight"><pre><span class="gu">@@ -2983,51 +2983,24 @@</span> - * Python 2.6 can be built with Microsoft Visual Studio 2008 (version - 9.0), and this is the new default compiler. See the - :file:`PCbuild` directory for the build files. (Implemented by - Christian Heimes.) - - * On Mac OS X, Python 2.6 can be compiled as a 4-way universal build. - The :program:`configure` script - can take a :option:`--with-universal-archs=[32-bit|64-bit|all]` - switch, controlling whether the binaries are built for 32-bit - architectures (x86, PowerPC), 64-bit (x86-64 and PPC-64), or both. - (Contributed by Ronald Oussoren.) - -<span class="gd">-* A new function added in Python 2.6.6, :cfunc:`PySys_SetArgvEx`, sets</span> -<span class="gd">- the value of ``sys.argv`` and can optionally update ``sys.path`` to</span> -<span class="gd">- include the directory containing the script named by ``sys.argv[0]``</span> -<span class="gd">- depending on the value of an *updatepath* parameter.</span> -<span class="gd">-</span> -<span class="gd">- This function was added to close a security hole for applications</span> -<span class="gd">- that embed Python. The old function, :cfunc:`PySys_SetArgv`, would</span> -<span class="gd">- always update ``sys.path``, and sometimes it would add the current</span> -<span class="gd">- directory. This meant that, if you ran an application embedding</span> -<span class="gd">- Python in a directory controlled by someone else, attackers could</span> -<span class="gd">- put a Trojan-horse module in the directory (say, a file named</span> -<span class="gd">- :file:`os.py`) that your application would then import and run.</span> -<span class="gd">-</span> -<span class="gd">- If you maintain a C/C++ application that embeds Python, check</span> -<span class="gd">- whether you're calling :cfunc:`PySys_SetArgv` and carefully consider</span> -<span class="gd">- whether the application should be using :cfunc:`PySys_SetArgvEx`</span> -<span class="gd">- with *updatepath* set to false. Note that using this function will</span> -<span class="gd">- break compatibility with Python versions 2.6.5 and earlier; if you</span> -<span class="gd">- have to continue working with earlier versions, you can leave</span> -<span class="gd">- the call to :cfunc:`PySys_SetArgv` alone and call</span> -<span class="gd">- ``PyRun_SimpleString("sys.path.pop(0)\n")`` afterwards to discard</span> -<span class="gd">- the first ``sys.path`` component.</span> -<span class="gd">-</span> -<span class="gd">- Security issue reported as `CVE-2008-5983</span> -<span class="gd">- <http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-5983>`_;</span> -<span class="gd">- discussed in :issue:`5753`, and fixed by Antoine Pitrou.</span> -<span class="gd">-</span> - * The BerkeleyDB module now has a C API object, available as - ``bsddb.db.api``. This object can be used by other C extensions - that wish to use the :mod:`bsddb` module for their own purposes. - (Contributed by Duncan Grisby.) - - * The new buffer interface, previously described in - `the PEP 3118 section <#pep-3118-revised-buffer-protocol>`__, - adds :cfunc:`PyObject_GetBuffer` and :cfunc:`PyBuffer_Release`, - as well as a few other functions. - - * Python's use of the C stdio library is now thread-safe, or at least - as thread-safe as the underlying library is. A long-standing potential -<span class="gu">@@ -3312,33 +3285,24 @@</span> - when accessed using slicing or index access; having - :class:`Exception` behave like a tuple is being phased out. - - * (3.0-warning mode) inequality comparisons between two dictionaries - or two objects that don't implement comparison methods are reported - as warnings. ``dict1 == dict2`` still works, but ``dict1 < dict2`` - is being phased out. - - Comparisons between cells, which are an implementation detail of Python's - scoping rules, also cause warnings because such comparisons are forbidden - entirely in 3.0. - -<span class="gd">-For applications that embed Python:</span> -<span class="gd">-</span> -<span class="gd">-* The :cfunc:`PySys_SetArgvEx` function was added in Python 2.6.6,</span> -<span class="gd">- letting applications close a security hole when the existing</span> -<span class="gd">- :cfunc:`PySys_SetArgv` function was used. Check whether you're</span> -<span class="gd">- calling :cfunc:`PySys_SetArgv` and carefully consider whether the</span> -<span class="gd">- application should be using :cfunc:`PySys_SetArgvEx` with</span> -<span class="gd">- *updatepath* set to false.</span> -<span class="gd">-</span> - .. ====================================================================== - - - .. _26acks: - - Acknowledgements - ================ - - The author would like to thank the following people for offering - suggestions, corrections and assistance with various drafts of this - article: Georg Brandl, Steve Brown, Nick Coghlan, Ralph Corderoy, - Jim Jewett, Kent Johnson, Chris Lambacher, Martin Michlmayr, -</pre></div> - -</body> -</html> ======================================= --- /whatsnew/index.rst.diff Sun Oct 30 17:04:23 2011 +++ /dev/null @@ -1,21 +0,0 @@ -@@ -2,19 +2,20 @@ - - ###################### - What's New in Python - ###################### - - The "What's New in Python" series of essays takes tours through the most - important changes between major Python versions. They are a "must read" for - anyone wishing to stay up-to-date after a new release. - - .. toctree:: - :maxdepth: 2 - -+ 2.7.rst - 2.6.rst - 2.5.rst - 2.4.rst - 2.3.rst - 2.2.rst - 2.1.rst - 2.0.rst ======================================= --- /whatsnew/index.rst.diff.html Sun Oct 30 17:04:23 2011 +++ /dev/null @@ -1,95 +0,0 @@ -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> -<title>whatsnew/index.rst</title> -<style type="text/css"> -.highlight .hll { background-color: #ffffcc } -.highlight { background: #f8f8f8; } -.highlight .c { color: #408080; font-style: italic } /* Comment */ -.highlight .err { border: 1px solid #FF0000 } /* Error */ -.highlight .k { color: #008000; font-weight: bold } /* Keyword */ -.highlight .o { color: #666666 } /* Operator */ -.highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */ -.highlight .cp { color: #BC7A00 } /* Comment.Preproc */ -.highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */ -.highlight .cs { color: #408080; font-style: italic } /* Comment.Special */ -.highlight .gd { color: #A00000 } /* Generic.Deleted */ -.highlight .ge { font-style: italic } /* Generic.Emph */ -.highlight .gr { color: #FF0000 } /* Generic.Error */ -.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ -.highlight .gi { color: #00A000 } /* Generic.Inserted */ -.highlight .go { color: #808080 } /* Generic.Output */ -.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ -.highlight .gs { font-weight: bold } /* Generic.Strong */ -.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ -.highlight .gt { color: #0040D0 } /* Generic.Traceback */ -.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ -.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ -.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ -.highlight .kp { color: #008000 } /* Keyword.Pseudo */ -.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ -.highlight .kt { color: #B00040 } /* Keyword.Type */ -.highlight .m { color: #666666 } /* Literal.Number */ -.highlight .s { color: #BA2121 } /* Literal.String */ -.highlight .na { color: #7D9029 } /* Name.Attribute */ -.highlight .nb { color: #008000 } /* Name.Builtin */ -.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ -.highlight .no { color: #880000 } /* Name.Constant */ -.highlight .nd { color: #AA22FF } /* Name.Decorator */ -.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */ -.highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ -.highlight .nf { color: #0000FF } /* Name.Function */ -.highlight .nl { color: #A0A000 } /* Name.Label */ -.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ -.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ -.highlight .nv { color: #19177C } /* Name.Variable */ -.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ -.highlight .w { color: #bbbbbb } /* Text.Whitespace */ -.highlight .mf { color: #666666 } /* Literal.Number.Float */ -.highlight .mh { color: #666666 } /* Literal.Number.Hex */ -.highlight .mi { color: #666666 } /* Literal.Number.Integer */ -.highlight .mo { color: #666666 } /* Literal.Number.Oct */ -.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ -.highlight .sc { color: #BA2121 } /* Literal.String.Char */ -.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ -.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ -.highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ -.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ -.highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ -.highlight .sx { color: #008000 } /* Literal.String.Other */ -.highlight .sr { color: #BB6688 } /* Literal.String.Regex */ -.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ -.highlight .ss { color: #19177C } /* Literal.String.Symbol */ -.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ -.highlight .vc { color: #19177C } /* Name.Variable.Class */ -.highlight .vg { color: #19177C } /* Name.Variable.Global */ -.highlight .vi { color: #19177C } /* Name.Variable.Instance */ -.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ -</style> -</head> -<body> -<div class="highlight"><pre><span class="gu">@@ -2,19 +2,20 @@</span> - - ###################### - What's New in Python - ###################### - - The "What's New in Python" series of essays takes tours through the most - important changes between major Python versions. They are a "must read" for - anyone wishing to stay up-to-date after a new release. - - .. toctree:: - :maxdepth: 2 - -<span class="gi">+ 2.7.rst</span> - 2.6.rst - 2.5.rst - 2.4.rst - 2.3.rst - 2.2.rst - 2.1.rst - 2.0.rst -</pre></div> - -</body> -</html>