静的なラング(Java/C#)からPythonのような動的な言語に移動する人のためのトップのゴトカス
-
02-10-2019 - |
質問
静的なラング(Java/C#)からPythonのようなダイナミックな言語に移動する人のトップゴッチャは何ですか?
物事がどのように行われるかはクールに思えますが、メソッドの名前を変更したり、パラメーターを追加/削除したりすることは非常に危険です!
各メソッドのテストを作成する唯一のソリューションですか?
解決
ナンバーワンのゴッチャは、動的な言語で静的にタイプされたコードを作成しようとしていると思います。
識別子を使用して文字列を指すことをheしないでください。次に、コードの自己完結型セクションのリストを指します
keys = 'foo bar foobar' # Imagine this coming in as an argument
keys = keys.split() # Now the semantically chose name for the argument can be
# reused As the semantically chosen name for a local variable
通常の価値のような機能を扱うことを躊躇しないでください:それらはそうです。次のパーサーを取ります。すべてのヘッダータグとOLタグのようなULタグを同様に扱う必要があると仮定します。
class Parser(HTMLParser):
def __init__(self, html):
self.feed(html)
def handle_starttag(self, tag, attrs):
parse_method = 'parse_' + tag
if hasattr(self, parse_method):
getattr(self, parse_method)(attrs)
def parse_list(self, attrs):
# generic code
def parse_header(self, attrs):
# more generic code
parse_h1 = parse_h2 = parse_h3 = parse_h4 = parse_h5 = parse_h6 = parse_header
parse_ol = parse_ul = parse_list
これは、より少ない一般的なコードを使用することで実行できます handle_starttag
どのタグを同じ方法にマッピングするかを追跡することによりJavaのような言語の方法が、Divタグを処理することを決定する場合は、それをディスパッチロジックに追加する必要があります。ここでは、メソッドを追加するだけです parse_div
そして、あなたは行ってもいいです。
TypeCheckしないでください! アヒルタイプ!
def funtion(arg):
if hasattr(arg, 'attr1') and hasattr(arg, 'attr2'):
foo(arg):
else:
raise TypeError("arg must have 'attr1' and 'attr2'")
とは対照的に isinstance(arg, Foo)
. 。これにより、任意のオブジェクトを渡すことができます attr1
と attr2
. 。これにより、たとえば、デバッグ目的でオブジェクトに巻き付けられたトレースクラスでパスできます。 Java Afaikでそれを行うには、クラスを変更する必要があります。
THC4Kが指摘したように、これを行うための別の(より多くの)方法は EAPF 熟語。できるだけ早くエラーをキャッチするのが好きなので、私はこれが好きではありません。ただし、コードがめったに失敗することはほとんどない場合は、より効率的です。私はそれが好きではないことを誰にも言わないでください。これは、THC4Kの厚意による例です。
try:
foo(arg):
except (AttributeError, TypeError):
raise InvalidArgumentError(foo, arg)
それは私たちがキャッチするべきかどうかについてのトスアップです AttributeError
と TypeError
または、それらを処理する方法を知っている場所に伝播させますが、これは単なる例ですので、飛ばします。
他のヒント
「各方法のテストを書く唯一の解決策はありますか?」
あなたはあなたを言っていますか しなかった Javaの各メソッドのテストを作成しますか?
Javaの各メソッドのテストを書いた場合 - まあ、何も変わりませんか?
メソッドの名前を変更すると、とても危険です!
正しい。それをしないでください。
パラメーターを追加/削除することはとても危険です!
何?オプションのパラメーターについて話しているのですか?もしそうなら、Javaで複数の過負荷の名前を持つことは、危険で混乱しているようです。オプションのパラメーターを使用すると、より簡単に思えます。
最も一般的なPythonの質問を検索すると、いくつかのことが慢性的な質問であることがわかります。
更新する方法
PYTHONPATH
.何らかのランダムな浮動小数点計算が数学的な抽象化が示すように同じではない理由。
Python 2チュートリアルからPython 3と入力コードを使用します。
Pythonにスーパーコンプレックスがない理由
protected
,private
とpublic
宣言。Pythonに列挙タイプがない理由。
#1の慢性的な問題は、機能のデフォルト値として可変オブジェクトを使用しているようです。これを避けてください。
最初にPythonを試してみたときに私を襲ったいくつかのこと(主にJavaの背景から来る):
書く Pythonic コード。古いJava/Cの方法で行うのではなく、Pythonに推奨されるイディオムを使用します。これは、単なる化粧品や独断的な問題以上のものです。 Pythonicコードは、実際には実際には実際に常にCのようなコードよりも非常に高速です。実際のところ、「Pythonが遅い」という概念の多くの概念が浮かんでいるのは、経験の浅いコーダーがPythonでJava/Cをコーディングしようとし、大きなパフォーマンスを打つことになり、Pythonがひどく遅い。リストの包含とマップ/フィルター/削減を可能にする場合は、マップ/フィルター/削減を使用します。
関数は真のオブジェクトであるという考えに満足してください。コールバックとしてそれらを渡し、機能を返す機能を作成し、閉鎖について学びます。
あなたが言及しているように、あなたがPythonに変更するように、Pythonでできるクールでほとんど魔法のようなことがたくさんあります。これらのことは、Pythonの機能を披露するのに最適ですが、必要ではない場合は実際には必要ありません。確かに、S。lottが指摘したように、危険に見えるものを避ける方が良いです。