このような質問があるときは、コードをモデル化できる標準ライブラリを探しています。それは
processes = int(processes)
それはちょうどあなたがそれを整数ではなく、浮動小数点数や文字列、または何を送ったと仮定し言っていないことを
class Pool(object):
def __init__(self, processes=None, initializer=None, initargs=(),
maxtasksperchild=None):
...
if processes is None:
try:
processes = cpu_count()
except NotImplementedError:
processes = 1
if processes < 1:
raise ValueError("Number of processes must be at least 1")
if initializer is not None and not hasattr(initializer, '__call__'):
raise TypeError('initializer must be a callable')
お知らせ:multiprocessing/pool.pyはあなたにやや近いクラスがあります。 かなり分かりやすいはずですが、そうではないと感じたら、それを文書化するだけで十分です。
processes < 1
の場合はValueError
を発行し、指定されている場合はinitializer
が呼び出し可能であることを確認します。
私たちがモデルとしてmultiprocessing.Pool
を取るのであれば、あなたのクラスには、次のようになります。
class ClassWithThreads(object):
def __init__(self, num_threads):
self.num_threads = num_threads
if self.num_threads < 1:
raise ValueError('Number of threads must be at least 1')
は、このアプローチは、おそらくいくつか 条件のために非常に予測不可能に失敗しませんか?
私は先制型チェックは、一般的にPythonの (するダイナミック、ダックタイピング)設計理念の穀物に反すると思います。
ダックタイピングPythonプログラマに素晴らしい表現力の機会、 と迅速なコード開発を与えるが(一部は言うかもしれない)、それは型エラーをキャッチするために何 試みをしないため危険です。
論理エラーは、エラー よりもはるかに深刻で頻繁であると主張する人もいます。より重大なエラーを検出するには、単体テストが必要です。したがって、 でもプリエンプティブタイプのチェックをしても、それほどの保護はありません。
この議論は、事実ではなく意見の領域にあるため、解決できる議論ではありません。フェンス のどちらの側に座っているかは、あなたの経験、タイプ の可能性に関するあなたの判断に依存する可能性があります。すでに知っている言語で偏っているかもしれません。問題のドメイン に依存することがあります。
自分で決めなければなりません。
PS。静的型付き言語では、コンパイル時に型チェックを行うことができるため、プログラムの速度を損なうことはありません。 Pythonでは、型チェックは実行時に行わなければなりません。これにより、プログラムが少し遅くなります。ループ内でチェックが行われている場合は、多分多分です。プログラムが増えると、型チェックの数も増えます。残念ながら、これらの小切手の多くは重複している可能性があります。したがって、実際に型チェックが必要と思われる場合は、静的型の言語を使用する必要があります。
PPS。 (Python 2)と(Python 3)の型チェックのためのデコレータがあります。これにより、タイプチェックコードが残りの関数と分離され、将来的にタイプチェックをオフにすることができます。
ユーザ向けのインターフェイスでない場合は、そのままにして、例外を自然に伝播させます。あなたは自分でもっと仕事をしていますし、例外をラップしても大きな価値はありません。 – monkut