Как мне взять имя клиента и список клиентов в качестве двух параметров для функции, которая будет записана в следующей строке под названием search ()? - PullRequest
0 голосов
/ 30 октября 2018

Идея состоит в том, что функция "search ()" должна принимать имя клиента и список клиентов в качестве параметров и проверять, был ли клиент в customer.txt (затем возвращать True) или нет (затем возвращать False).

Спецификации: 1) взять имя клиента и список клиентов (список, созданный writeData (), customer.txt) в качестве его параметров 2) проверить, есть ли имя в списке 3) Если это верните True; если нет, верните False.

В настоящее время
1) всякий раз, когда я набираю S в меню, он говорит, что отсутствует два обязательных позиционных аргумента

Traceback (последний последний вызов):

    cdman()
  File "test.py", line 55, in cdman
    menu()
  File "test.py", line 24, in menu
    search()
TypeError: search() missing 2 required positional arguments: 'name' and 'filename'

2) Если я просто вызываю "search ()" в оболочке, он говорит, что "name" search "не определен", как до, так и после вызова "cdman ()" first

3) Если бы я имел имя «Джейкоб Уолкер» в файле и попытался найти его, он выделил бы Уокера и произнесет неверный синтаксис

def cdman():

    def menu():

        print('*------------------------*')
        print('| Customer Database Menu |')
        print('*------------------------*\n')

        choice = input('D: Create/Update Customer Data\nR: Display Database\nS: Search for User\nE: End Program\n')
        if choice == 'D':
            writeData()
            menu()
        elif choice == 'S':
            search()
            menu()
        elif choice == 'R':
            readData()
            menu()
        elif choice == 'E':
            print('PROGRAM TERMINATED')

    def writeData():
        while True:
            database = open('customer.txt', 'a')
            name = input('Name: ')
            if name == '-1':
                database.close()
                return False
            else:
                id_num = input('ID: ')
                database.write('Name: ' + name + ' ')
                database.write('ID: ' + id_num + '\n')

    def readData():
        database = open('customer.txt', 'r')
        for line in database:
            print(line)

    def search(name, filename):
        if name in open(filename).read():
            print('True')
        else:
            print('False')

    menu()
cdman()

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Ваша проблема в том, что вы пытаетесь вызвать вашу функцию search без передачи аргументов, которые, как вы сказали, ей нужны (name и filename)

Этот вопрос о переполнении стека содержит подробное объяснение параметров функции python , и было бы полезно прочитать, а также эту статью . Чтобы устранить ошибку, с которой вы сталкиваетесь, есть 2 основных решения.

Первое решение (которое более полезно в зависимости от того, что делает ваш код) - фактически передать параметры. Где у вас есть

elif choice == 'S':
   search()
   menu()

Вы должны сказать, что искать, т.е.

elif choice == 'S':
   search('Bob', 'customer.txt')
   menu()

Вы также можете указать значения параметров по умолчанию, так, как они записаны сейчас

 def search(name, filename):

Ожидается получение этих значений, иначе они не будут определены (ошибка, с которой вы работаете)

Вы можете указать ему значение по умолчанию для обработки и обработки случаев, когда ничего не передается, например:

  def search(name=None, filename='customer.txt'):
        if name is None:
           print('No name provided!')
        elif name in open(filename).read():
            print('True')
        else:
            print('False')
0 голосов
/ 30 октября 2018

Прежде всего, вы вызываете функцию search() в своем коде без параметров, но в ее определении вы передаете два параметра.

Итак, после ввода 'S' ваша программа ожидает search(CustomerName, FileName), но не search().

elif choice == 'S':
   search(CustomerName, FileName)
   menu()

Думаю, ваша search() функция не может прочитать все доступные строки в файле. Попробуйте использовать следующий код для функции search ():

def search(CustomerName, filename):
    with open(filename, "r") as fp:
        Customer_Names = [name.rstrip('\n') for name in fp.readlines()] 
    for AvailableName in Customer_Names:
        if AvailableName == CustomerName:
            print True
        else:
            print False 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...