何clojureのPythonム"が__name__=='__main__'"?
質問
私ツclojure、持ちょっとしたトラブル把握に努めると共に、のclojureび/またはLisp)と同等の共通のpythonム.
音はと以下のようにpythonモジュールがありすることは、多くの場合、ビットのテストコードを書を走るコードは、例えば:
# mymodule.py
class MyClass(object):
"""Main logic / code for the library lives here"""
pass
def _runTests():
# Code which tests various aspects of MyClass...
mc = MyClass() # etc...
assert 2 + 2 == 4
if __name__ == '__main__': _runTests()
このため、アドホック。については、通常はこのモジュールを書く from mymodule import MyClass
, り、その場合、 _runTests()
はないというが、スニペットの一つで走ることができますのでタイピング python mymodule.py
から直接ョンをインストールして下さい。
は相当の熟にClojure(and/or common lisp)?いした後、フルブユニットテスト図書館(といっても、こういうを含め一部のコードモジュールの一部だけを実行する特定の状況下でいて、迅速な実行コードできないかなぁ、とおもってでもするファイルの輸入など通常のモジュール/namespace.
解決
これは、コマンドラインから何度もClojureのスクリプトを実行するために慣用的ではありません。 REPLは、より良いコマンドラインです。 Clojureのは、Lispのこと、それはClojureのを起動し、永遠に実行されている同じインスタンスを残し、そしてそれと対話するのではなく、それを再起動するのが一般的です。あなたは、一度に実行中のインスタンス1での機能を変更するそれらを実行し、必要に応じて突くことができます。退屈で遅い伝統的な編集/コンパイル/デバッグサイクルをエスケープすることのLispの大きな特徴です。
あなたは簡単に実行ユニットテストのようなものを行うための関数を書き、あなたがそれらを実行し、そうでない場合はそれらを無視したいときだけREPLからこれらの機能を呼び出すことができます。 Clojureのは、clojure.contrib.test-is
を使用し、あなたの名前空間にテスト機能を追加し、その後、それらのすべてを実行するためにclojure.contrib.test-is/run-tests
を使用するには、それが一般的です。
コマンドラインからのClojureを実行しないもう一つの良い理由は、JVMの起動時間が法外にできることである。
あなたは本当にコマンドラインからClojureのスクリプトを実行したい場合は、、あなたがそれを行うことができる方法の束があります。いくつかの議論のためのClojureのメーリングリストのrel="noreferrer">
一つの方法は、コマンドライン引数の存在をテストすることです。 あなたはClojureのを開始するかによって異なる動作を取得します。 Clojureのソースに もう一つの方法は、 コンパイル clojure.org の上Clojureのコードをコンパイルに関する多くの情報があります。foo.clj
考えます
(ns foo)
(defn hello [x] (println "Hello," x))
(if *command-line-args*
(hello "command line")
(hello "REPL"))
あなたはこれが動作しているかを確認したい場合は、$ java -cp ~/path/to/clojure.jar:. clojure.main foo.clj --
Hello, command line
$ java -cp ~/path/to/clojure.jar:. clojure.main
Clojure 1.1.0-alpha-SNAPSHOT
user=> (use 'foo)
Hello, REPL
nil
user=>
src/clj/clojure/main.clj
を参照してください。.class
ファイルにコードをコンパイルし、Javaコマンドラインからそれらを呼び出すことです。与えられたソースファイルfoo.clj
ます:(ns foo
(:gen-class))
(defn hello [x] (println "Hello," x))
(defn -main [] (hello "command line"))
.class
ファイルを格納するディレクトリを作成します。これはデフォルト./classes
します。あなたはClojureのは、それを作成しません、これは自分でフォルダを作成する必要があります。また、あなたが$CLASSPATH
とソースコードのあるディレクトリを含めるように./classes
を設定してください。私はfoo.clj
が現在のディレクトリにあると仮定します。だから、コマンドラインから:$ mkdir classes
$ java -cp ~/path/to/clojure.jar:./classes:. clojure.main
Clojure 1.1.0-alpha-SNAPSHOT
user=> (compile 'foo)
foo
classes
ディレクトリでは、今.class
ファイルの束を持っています。 (デフォルトでは-main
の機能を実行している)、コマンドラインからコードを呼び出すには:$ java -cp ~/path/to/clojure.jar:./classes foo
Hello, command line.
他のヒント
私はClojureのに非常に新しいですが、私は<のhref = "http://groups.google.com/group/clojure/browse_thread/thread/d3c2c328787c328f/8c8c526fee2d6deb?lnk=gst&q=clojure+python+__name__#考えますClojureのグループに8c8c526fee2d6deb」のrel = 『nofollowをnoreferrer』>この議論のは22:40で4月17日ソリューションおよび/または回避策、スチュアート・シエラによって、具体的ポストかもしれません。
共通Lisp利用できる条件付きで読みか 特徴.
#+testing (run-test 'is-answer-equal-42)
上記に概要が示されているとおり、このように実行時の荷重の場合は一覧の特徴へ cl*の特徴* が含まれまでのシンボル:試験をします。
例えば、
(let ((*features* (cons :testing *features*)))
(load "/foo/bar/my-answerlib.lisp"))
一時的に追加試験の一覧です。
を定義することができ独自の機能を制御する表現のCommon Lispシステムによって読み取るのでスキップ.
さらにもできます:
#-testing (print '|we are in production mode|)
あなたは<のhref =「http://code.google.com/p/clojure-contrib/source/browse/trunk/src/clojure/contrib/test_is.clj」のrelを見てしたい場合があります= "nofollowをnoreferrer">テストでのClojure-contribのからのライブラリが。それは同じイディオムではないが、それはかなり類似したワークフローをサポートする必要があります。
Common LispとClojure(その他のlisps)提供対話環境REPL、なぎのように"if __name__ == '__main__'
".あREPLような環境のためのpython:pythonからのコマンドライン、ipython、pythonモードのためのEmacs等
きを作成し、図書館、testsuiteを追加する多くの試験の枠組みCommon Lisp;やってました 朝5時 枠組みが調査の枠組みを用意 こちらの).しまいますし、それに負荷の図書館のREPLできないものの、図書館の走行試験、機能試験等
を探したいときは不試験く、修正、再コンパイルの変更コードを、実験、走行試験を再起動なしの願います。このため、アプリケーションの実行が蓄積していく状態で作成したwindows guiで接続し、データベースに達したものの重要な瞬間にはなりにくいreproduceable)られないときには、いくつかを再起動して毎に変化します。
この例Common Lisp(マcl-sqlite図書館):
コード:
(def-suite sqlite-suite)
(defun run-all-tests ()
(run! 'sqlite-suite));'
(in-suite sqlite-suite)
(test test-connect
(with-open-database (db ":memory:")))
(test test-disconnect-with-statements
(finishes
(with-open-database (db ":memory:")
(prepare-statement db "create table users (id integer primary key, user_name text not null, age integer null)"))))
...
のインタラクティブセッション:
CL-USER> (sqlite-tests:run-all-tests)
.......
Did 7 checks.
Pass: 7 (100%)
Skip: 0 ( 0%)
Fail: 0 ( 0%)
NIL
CL-USER> (defvar *db* (sqlite:connect ":memory:"))
*DB*
CL-USER> (sqlite:execute-non-query *db* "create table t1 (field text not null)")
; No value
CL-USER> (sqlite:execute-non-query *db* "insert into t1 (field) values (?)" "hello")
; No value
CL-USER> (sqlite:execute-to-list *db* "select * from t1")
(("hello"))
CL-USER>
今からバグsqliteを実行しめます。というコードの機能の不具合を修正および再コンパイルこの機能です。そして私は、固定機能を確保することができる。メモリ内のデータベースではなく、同じ状態であった前を再コンパイル.
ブートには、<のhref =」という、ビルド・ツール(Leiningenをする代わりに)でありますhttps://github.com/boot-clj/boot/wiki/Scripts」のrel = "nofollowを">は、スクリプトをサポートしています。だから、#!/usr/bin/env boot
メソッドを持つことができます-main
で始まるブートスクリプトを持つことができます。
また、あなたのコードの異なる機能を呼び出すでしょうコマンドラインから起動タスクを作ることができます。そして、あなたは、エントリポイントとして、これらの機能のいずれかのuberjarを作成することができ、パッケージングタスクを持つことができます。
あなたは「エントリーポイント」を持っていることについて話している場合、あなたは確かにそれを行うことができます:
(ns foo)
(defn foo [n]
(inc n))
(defn main []
(println "working")
(println "Foo has ran:" (foo 1)))
(main)
今何が起こるだろうことは、いつでもこのコードは(ロード・ファイル「foo.clj」)「Dまたは(使用」FOO)や、次に、(「FOOを必要とする)であるということである(メイン)と呼ばれる、それは通常はありません行われます。
はるかに一般的コードのファイルは、REPLにロードすることができ、次いで、主な機能は、ユーザによって呼び出されるであろうということである。