1

たとえば、人を表す簡単なクラスを考えてみましょう。唯一のクラス属性は、人物名を表す文字列です。コンストラクターにintやlistなどの他のタイプのオブジェクトを渡そうとしないようにしたいのです。これは以下の私の最初の試みでした。引数がstrでない場合、これはタイプNoneのobjを返すと思いましたが、それでもPersonobjを返すようです。私は「もっと」強く型付けされた言語のバックグラウンドから来ており、Pythonで自分自身を処理する方法として少し混乱しています。pythonicスタイルはこの状況と型安全性についてより一般的に何と言っていますか?例外を発生させる必要がありますか?または、Noneを返す方法を見つけますか?または完全に何か他のもの。

class Person: 

    name = None

    def __init__(self, name):
        if not isinstance(name, str):
            return None
        self.name = name
4

3 に答える 3

6

それについてです-何らかの形式のデコレータを使用することはできませんが、一般的に、型チェックはあまりPythonicではありませんが、場合によっては有効ですが、コードは次のようになります。

def __init__(self, name):
    if not isinstance(name, basestring):
        raise TypeError('name must be str/unicode')
    # ...

basestringはPython2.xの親であるstrことに注意してくださいunicode。これにより、両方が可能になりますstr(2.xでは現在のように)ユニコードを許可しないようにします(またはその逆)。3.xにbasestringは存在しません、あなたはちょうど持っていstrます。

于 2012-12-18T16:23:18.483 に答える
6

メソッド内でエラーを発生させたい__init__場合:

if not isinstance(name,basestring):
    raise TypeError("I don't think that is a name ...")

* python2.xにbasestringも含まunicodeれていますが、python3.xでは使用できないことに注意してください。

ただし、ここでは、作成後にユーザーが個人の名前をリストに再設定することを妨げるものは何もありませんperson

jack = Person("Jack")
jack.name = ["cheese","steak"]  #???

この安全性を組み込みたい場合は、について学び始める必要がありますproperty

于 2012-12-18T16:23:18.637 に答える
0

私はここに戻るNoneのではなく、間違ったオブジェクトタイプを示すために例外を発生させます。

于 2012-12-18T16:23:21.807 に答える