3

私はプログラミングに比較的慣れていないので、以下をダックタイピングと呼んでばかげた間違いを犯している場合は、ご容赦ください。

文字列またはタプル (文字列を含む)を 1 つの引数として受け取るプロシージャがあります。

例:

def proc(arg):
    try:
        arg is a tuple
        handle arg a tuple
    except:
        arg is a simple string
        handle it so

引数がタプルであるかどうかによって、関数の動作が異なるようにしたいと考えています。

タイプチェックはしたくないので、try..exceptプロセスを使いたいです。

試してみようと思っarg[0]たのですが、Python の文字列もオブジェクトであり、その点ではタプルのように動作し、何かを返します。

ここで何ができますか?

ありがとうございました。

4

3 に答える 3

5

あなたの場合、変数のタイプに応じて異なる動作をしたいので、試してみないことをお勧めします...

try..except を使用する必要があるのは、異なる動作をしない場合です。

私のコメントから:

コードが常に同じように動作することを期待し、そうでない場合は、例外を使用する必要があります。ここでは、変数に応じてコードの動作が異なるようにする必要があるため、try..except ではなく、それが何であるかを確認する必要があります。

使用できますisinstance

isinstance(x, tuple)

との違いについては、この投稿を参照してください。isinstancetype

ダックタイピングと許しについて


あなたのコードと私の答えを使用してソリューションを作成します。

def proc(arg):
    if isinstance(arg, tuple):
        # handle as tuple
    elif isinstance(arg, str):
        # handle as str
    else:
        # unhandled?
于 2013-04-09T15:03:12.307 に答える
1

あなたの間違いはここにあると思います(経験豊富なプログラマーでさえ時々それをするので、まったく「ばかげている」とは言えません):

文字列またはタプル (文字列を含む) を単一の引数として受け取るプロシージャがあります...引数がタプルであるかどうかに応じて、関数の動作が異なるようにします。

そのような関数を設計しないでください。関数は1 つのことを行う必要があります。2 つの異なることが必要な場合は、2 つの関数を記述します。

def process_item(some_string):
def process_items(tuple_of_strings):

Python には明示的な型付けはありませんが、変数とパラメーターは型付けされたままにする必要があります。つまり、プログラムのどの時点でも、各変数の型を判別できる必要があります。isinstance少し誇張するリスクがありますが、コード内のすべてが設計上の欠陥の兆候であると言えます。デザインを修正すれば、回避策は必要ありません。

于 2013-04-09T15:33:40.267 に答える
0

とにかくそれが欲しい場合:

>>> s='vd sd'
>>> t=('ds','')
>>> t+='34'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate tuple (not "str") to tuple
>>> s+='34'
>>>
于 2013-04-09T15:14:37.097 に答える