2012-04-13 27 views
0

私の最初の大きなpythonプロジェクトでは、テキストベースのゲームを構築しています。物語やアイテムなどを編集して置き換えて、実際のソースコードをほとんど編集しないように、モジュール化されているはずです。基本的には、userコマンドは文字列として格納され、すぐにリストに分割されます。最初の要素は 'inspect'のようなアクションで、2番目の要素は 'location'や 'item'のようなアクションの疑似引数です。コマンドが解釈された後、それは 'item_or_loc'と呼ばれる実行モジュールに行きます。ここでエラーが発生します。誰も助けることができますか?より多くの情報やソースコード全体が役立つなら、それを提供します。Python TypeError: 'NoneType'型の引数が反復可能でない

コマンドモジュール:

def item_or_loc(iolo): 
     if iolo in items.items_f(): 
      print (items.iolo(1)) 
     elif iolo in locations.locations_f(): 
      print (locations.iolo(1)) 
     else: 
      print ('Command not recognized, try again.') 


    def location(loco): 
     plo_l = PlayerClass #(player location object_location) 
     if loco == 'location': 
      plo_l.player_loc(0) 


    def abort(abo): 
     sys.exit() 


    def inventory(invo): 
     pio_i = PlayerClass #(player inventory object_inventory) 
     if invo == 'inventory': 
      pio_i.player_inv(0) 

アイテムモジュール:

patient_gown=('Patient gown', 'A light blue patient\'s gown.') 
    wrench=('Wrench','') 
    stick=('Stick','') 
    prybar=('Prybar','') 
    screwdriver=('Screwdriver','') 
    scalpel=('Scalpel','') 
    broken_tile=('Broken tile','') 
    hatchet=('Hatchet','') 
    janitor_suit=('Janitor suit','') 

場所モジュール:アイテムモジュールと基本的に同じ

プレーヤーモジュール:

import items 
    import locations 

    class PlayerClass: 
     def player_inv(inv_index): 
     pinventory = [items.patient_gown[inv_index]] 
     print (pinventory) 

    def player_loc(loc_index): 
     ploc = [locations.cell[loc_index]] 
     print (ploc) 
+2

ソースコードの形でより多くのコンテキストを提供することは非常に役に立ちます。これだけであなたを助けるのは難しいです。 –

+0

どれくらいお望みですか? command.pyモジュール全体? – SciurusDoomus

+0

少なくとも 'items'がどこから来ているのかの説明。 –

答えて

3

あなたドン〜しないitems.items_fから何かを返します。コンテナやシーケンスを返す必要があります。私は以下とは異なるアプローチをお勧めしますが、少なくとも始まりです。説明するの

def items_f(): 
    patient_gown=('Patient gown','A light blue patient\'s gown.') 
    wrench=('','') 
    stick=('','') 
    crowbar=('','') 
    screwdriver=('','') 
    scalpel=('','') 
    broken_tile=('','') 
    hatchet=('','') 
    janitor_suit=('','') 
    return (patient_gown, wrench, stick, crowbar, 
      screwdriver, scalpel, broken_tile, hatchet, janitor_suit) 

items_fは、コンテナ自体ではなく、機能(またはより正確に、あなたは、単にオブジェクトに「添付」機能として考えることができます方法)です。関数にはには何も返さないがありますが、それらを呼び出すと、呼び出しの結果の値は単にNoneになります。

if x in y:のようなテストを行うときは、yはシーケンスまたはコンテナタイプでなければなりません。関数items_fの結果をテストしているので、上に定義したようにその関数がNoneを返してくるので、テストではエラーがスローされます。

この状況を処理する最善の方法は、プログラムのより大きな構造に大きく依存します。正しい方向への最初のステップは次のようなものです:

def items_f(): 
    return (('Patient gown', 'A light blue patient\'s gown.'), 
      ('Wrench', 'A crescent wrench.'), 
      ('Stick', '...')) 

しかし、これはおそらく最良の解決策ではありません。あなたが上に追加したものに基づいて私の提案は(今、items_f関数が欠落しています)、アイテムを保持する何らかの種類のデータ構造を使用することになります。簡単なアプローチは辞書です:

items = {'patient_gown':('Patient gown', 'A light blue patient\'s gown.'), 
     'wrench':('Wrench', '...'), 
      ... 
     } 

これは、すべての可能な項目を含む辞書を作成します。特定のアイテムが必要な場合は、次のように設定できます。

item = items['patient_gown'] 

このようにして、機能はまったく必要ありません。辞書全体に直接アクセスすることができます。

+0

私の答えを削除するのは、まったく同じことを言う私たちの2人にはあまり意味がないからです。 –

+0

まあ、タプルやリストなどに項目リストの名前をすべて入力したくないということです。 (私はタプルが不変のときよりもおそらく良いだろうと思う。) – SciurusDoomus

+0

@DavidHeffernan、申し訳ありません、私はあなたの答えを踏んだ。私はちょうどより多くの情報を追加する機会を見て、本当に考えずにそうしました。 – senderle