-2

switch ステートメントを実装する関数を見つけました -->

File = open('/file.txt','r')

    String = File.readline()
    String = str(String)
    print String 

    for case in switch(String):
        if case("Head"):
            print "test successed"
            break
        if case("Small"):
            print String
            break
        if case("Big"):
            print String
            break  
        if case():
            print String 
            break 

印刷時の文字列値はHeadですが、switchステートメントは常に最後のケースになります.. v = "Head"で文字列を変更したときに機能したため、関数は明らかに正常に機能します!!!

何がうまくいかなかったのですか?

スイッチ機能 -->

class switch(object):
 def __init__(self, value):
    self.value = value
    self.fall = False

 def __iter__(self):
    """Return the match method once, then stop"""
    yield self.match
    raise StopIteration

 def match(self, *args):
    """Indicate whether or not to enter a case suite"""
    if self.fall or not args:
        return True
    elif self.value in args: # changed for v1.5, see below
        self.fall = True
        return True
    else:
        return False
4

3 に答える 3

5

このようなコードは絶対に書かないでください。適切な Python スタイルで実行してください。はるかに読みやすくなっています。その「スイッチ」の混乱の使用法に出くわした人は、おそらくあなたを心から呪うでしょう.

with open('/file.txt', 'r') as fp:
    line = fp.readline().rstrip('\n')
    print line

if line == 'Head':
    print "test successed"
elif line == 'Small':
    print line
elif line == 'Big':
    print line
else:
    print line

失敗する理由については、readline()呼び出しに末尾の改行文字が含まれている可能性が非常に高く、'Head' != 'Head\n'.

于 2012-05-07T06:31:32.190 に答える
0

.readline()改行文字を含む行全体を返します。

.strip()文字列を作成するか、比較する必要があります'Head\n'

また、スタイルに関しては、大文字の変数名は実際には Python のものではありません。

于 2012-05-07T06:26:25.593 に答える
0

編集:これはPythonicではないことは承知していますが、興味深い演習でした。

これは、OPが実装を追加する前でした-これが私の見解です。これ

  • raiseケースが定義されていない場合に意味のあるエラーが発生する -- またはallow_fallthroughが設定されている場合は、デフォルトのケースを次のように処理できますfor:else:
  • "switch"スイート内のどこでもデフォルトのケースが発生することを許可します

.

def switch(arg, allow_fallthrough = False):
    fail = False
    def switcher(*args):
        return (arg in args)
    def default_switcher(*args):
        return (not args)
    def fallthrough(*args):
        if not allow_fallthrough:
            raise ValueError("switch(%r) fell through" % arg)
    yield switcher
    yield default_switcher
    yield fallthrough

def test():
    String = "Smallish"

    for case in switch(String):
        if case():
            print "default", String 
            break
        if case("Head"):
            print "Head GET"
            break
        if case("Small", "Smallish"):
            print "Small:", String
            break
        if case("Big"):
            print "Big:", String
            break  
    else: # Only ever reached with `allow_fallthrough`
        print "No case matched"
于 2012-05-07T06:27:15.593 に答える