1

私はPythonを学ぼうとしています。私がフォローしているガイドは、タプル、リスト、クラスを利用して、簡単な「ゲーム」を書くように求めています。

'nosetests'コマンドを実行すると、次のエラーが発生します。

E.
====================================================================== ERROR:
tests.LEXICON_tests.test_directions
---------------------------------------------------------------------- 
Traceback (most recent call last):  
File "/Library/Python/2.6/site-packages/nose/case.py",
line 187, in runTest
   self.test(*self.arg)   
File "/Users/VB/Documents/svn/Programming/python/projects/lexicon/tests/LEXICON_tests.py",
line 6, in test_directions
   assert_equal(lexicon.scan("north"),
[('directions', 'north')]) TypeError:
unbound method scan() must be called
with lexicon instance as first
argument (got str instance instead)

---------------------------------------------------------------------- Ran 2 tests in 
 0.011s

 FAILED (errors=1) VB MP > ./lexicon.py

 > north [(), ('directions', 'north')] VB MP > ./lexicon.py 
 > north south east [[[(), ('directions', 'north')],
 ('directions', 'south')],
 ('directions', 'east')] VB MP 

メインファイル:

#!/usr/bin/env python
# encoding: utf-8

import sys
import os
from LEXICON.game import lexicon


def main():
    stuff = raw_input('> ') 

    lex = lexicon (stuff)

    split_array = lex.scan(stuff)
    print split_array

    #me = lex.tockens(split_array)
    #print me

if __name__ == '__main__':
    main()

class 
#!/usr/bin/env python
# encoding: utf-8
"""

import sys
import os

class lexicon (object):
    def __init__(self,data):
        self.direction = data
        #self.words = data.split()

    def scan(self,data):
        split_data = data.split()
        lex = lexicon (data)

        tocken = lex.tockens(split_data)


        return tocken

    def tockens(self,splitdata):

        sentence = splitdata
        verbs = ['go','swim','open','punch','fly','stop','kill','eat']
        objekts = ['door','bear','face','princess','cabinet']
        directions = ['north','south','east','west','down','up','left','right','back']
        stopwords = ['the','in','of','from','at','it']


        # setep 1, open the array

        bit = ()
        byte = ()
        for x in sentence:
            # step 2, match against verbs
            for v in verbs:
                try:
                    if (x == v):
                        bit = ('verb',x)
                        byte = [byte, bit]              
                except ValueError:
                    print "Ooops!"
            for o in objekts:
                try:
                    if (x == o):
                        bit = ('objekt',x)
                        byte = [byte, bit]
                except ValueError:
                    print "Ooops!"
            for d in directions:
                try:
                    if (x == d):
                        bit = ('directions',x)
                        byte = [byte, bit]
                except ValueError:
                    print "Ooops!"
            for s in stopwords:
                try:
                    if (x == s):
                        bit = ('stopwords',x)
                        byte = [byte, bit]
                except ValueError:
                    print "Ooops!"

        return byte

テスト

from nose.tools import *
#import LEXICON
from LEXICON.game import lexicon

def test_directions(): 
    assert_equal(lexicon.scan("north"), [('directions', 'north')]) 
    result = lexicon.scan("north south east") 
    assert_equal(result, [('directions', 'north'),
                          ('directions', 'south'), 
                          ('directions', 'east')])

ありがとう!

4

1 に答える 1

2

Python でメソッドが呼び出される方法は、メソッドが呼び出されるオブジェクトが最初の引数として渡され、指定された引数がそれぞれ 1 プッシュ ダウンされることです。インスタンス メソッドではなく静的メソッド (lexicon.scan) のように呼び出す場合(lex.scan) この最初の引数は指定されていません。

メソッド lexicon.scan では、最初の引数が「レキシコン」タイプのオブジェクトである必要があるため、おそらくテストで実行したいことは、レキシコン オブジェクトを作成し ( lex = lexicon(stuff))、そのオブジェクトからスキャンを呼び出すことです ( lex.scan("north"))。そのままではscan("north")、 を呼び出していますが、呼び出しを にしたいのですscan(lex, "north")

于 2011-04-12T01:17:55.933 に答える