Python TypeError: аргументът от тип „NoneType“ не може да се повтаря

Така че за първия си голям проект с Python изграждам текстово базирана игра. Предполага се, че е модулен, така че историята и елементите и т.н. могат да бъдат редактирани и заменени с малко редактиране на действителния изходен код. По принцип потребителската команда се съхранява като низ, който веднага се разделя на списък. Първият елемент е действие като „проверка“, а вторият елемент е псевдо-аргумент за това действие като „местоположение“ или „елемент“. След като командата бъде интерпретирана, тя отива в модула за изпълнение, наречен „item_or_loc“. Тук получавам грешката. Може ли някой да помогне? Ще предоставя повече информация или целия изходен код, ако ще помогне.

Команден модул:

    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','')

Модул Locations: По същество същият като модула Items

Модул за плейър:

    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)

person SciurusDoomus    schedule 13.04.2012    source източник
comment
Предоставянето на повече контекст под формата на изходен код би било много полезно. Трудно е да ти помогна много само с това.   -  person Nolen Royalty    schedule 14.04.2012
comment
Колко искаш? Целият модул command.py?   -  person SciurusDoomus    schedule 14.04.2012
comment
Поне обяснение откъде идва items.   -  person Nolen Royalty    schedule 14.04.2012
comment
@DavidHeffernan това е ясно, но отстраняването на грешки на проблема изисква да знаем откъде идват елементите, за да можем да видим защо е None...   -  person Nolen Royalty    schedule 14.04.2012
comment
@Nolen е ясно за вас и мен, но вероятно не и за задаващия въпроса. Ако беше така, въпросът би бил защо items.items_f() връща None.   -  person David Heffernan    schedule 14.04.2012
comment
По принцип Дейвид Хефернан е прав -- но все пак би било хубаво да видим дефиницията на items.items_f. Може да успеем да ви кажем откъде идва грешката.   -  person senderle    schedule 14.04.2012
comment
Там е. И да, ще се радвам на обяснение, защото съм хлапе сценаристи. Започнах да уча Python... преди три дни? да Имам малко oop опит, но не много.   -  person SciurusDoomus    schedule 14.04.2012
comment
Толкова мръсен код, вашият items_f() не връща нищо.   -  person pylover    schedule 14.04.2012
comment
Няма нужда да бъда груб, аз съм супер нов в програмирането като цяло.   -  person SciurusDoomus    schedule 14.04.2012
comment
Като странична бележка, този клас вероятно не прави това, което си мислите, че прави. Имате всички атрибути като атрибути на клас - това означава, че те се споделят между всеки екземпляр, а не са уникални за един обект. Освен това, ако използвате python2, не забравяйте да го направите клас с нов стил (Наследяване от object - class Player(object)). Не е ясно въз основа на това как сте написали вашите print изявления   -  person Daenyth    schedule 14.04.2012
comment
Честно казано, това беше нещо, което се опитах да го накарам да работи. Класът вече го няма и items.py просто е пълен със списъци. Благодаря за приноса все пак, оценявам го.   -  person SciurusDoomus    schedule 14.04.2012


Отговори (1)


Не връщате нищо от 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']

По този начин изобщо не се нуждаете от функция; можете просто да получите директен достъп до целия речник.

person senderle    schedule 13.04.2012
comment
Изтривам отговора си, тъй като няма смисъл двама от нас да казват едно и също нещо. - person David Heffernan; 14.04.2012
comment
Ами искам да кажа, че предпочитам да не въвеждам всички имена на списъците с елементи в кортеж или списък или каквото и да било. (Виждам, че кортеж вероятно би бил по-добър, тъй като е неизменен.) - person SciurusDoomus; 14.04.2012
comment
@DavidHeffernan, съжалявам, че тъпчах отговора ви; Току-що видях възможност да добавя повече информация и го направих, без да мисля. - person senderle; 14.04.2012
comment
@senderle Добре е. Вие го подкрепихте, като останахте с въпроса и добавихте още и още. Много добре. +1. - person David Heffernan; 14.04.2012
comment
Опитах се да добавя функцията за връщане в долната част, но тя съсипва командата "инвентар", която основно отпечатва инвентара на играча. Този инвентар се съхранява в модула player.py и наследява списъците с елементи от items.py. Когато опитам „inventory“, той казва AttributeError: „tuple“ object has no attribute „patient_gown“. По принцип искам да мога да напиша "инвентар" и да го накарам да отпечата списъка с инвентара на играча. Едновременно искам да напиша „проверете ‹артикул›“ и да ми даде описанието (индекс 1) на този артикул. - person SciurusDoomus; 14.04.2012
comment
@SciurusDoomus, мисля, че трябва да разбера повече за това какво е items.py. Дали това е просто модул, съдържащ всички възможни елементи? - person senderle; 14.04.2012
comment
Да, така е. Искате ли да кача текстовете за всички включени модули? Това ще включва модула за команди (получава аргументи от command_interpreter), модула за елементи, модула за играч и модула за местоположение. - person SciurusDoomus; 14.04.2012
comment
Трябват ми 20 повторения и нямам хахаха. съжалявам Всичко е в оригиналния пост... - person SciurusDoomus; 14.04.2012
comment
@SciurusDoomus, съжалявам тогава. Добавих още подробности. Обърнете внимание, че вероятно трябва да замените функцията items_f в items.py, така че първоначалният въпрос да не загуби значението си. - person senderle; 14.04.2012
comment
@senderle Благодаря ви много, това е наистина полезно. Радвам се, че проблемът беше със структурата на списъците ми, а не с останалата част от програмата. Оценявам вашата помощ. - person SciurusDoomus; 14.04.2012