Как мне исправить требуемый позиционный аргумент? - PullRequest
0 голосов
/ 23 февраля 2020

Я работаю над системой управления сотрудниками и столкнулся с проблемой позиционных аргументов. Я довольно новичок в программировании, и это проект для класса. Я следовал некоторым учебникам и книгам, но продолжаю получать эту ошибку:

Traceback (most recent call last):
  File "C:\Users\jmcra\Desktop\CPT200\Employment Management System - Functionality 4.1.py", line 152, in <module>
    searchEmployeeSSN()
TypeError: searchEmployeeSSN() missing 1 required positional argument: 'isForEdit'

Я пробовал несколько лекарств, но это только вызывает больше ошибок. Кто-нибудь, пожалуйста, помогите мне:

  1. Понять, что это значит, и
  2. Решить мою личную ситуацию?

Любая помощь очень ценится!

#initialize list to store employee' information
employee_info = [ ]
#initialize global variable to save the SSN
employeeSSN = 0
#initialize global variable to save the index of the found record
employeeIndex = 0
#clear the screen
def cls():
    print('\n' * 50)

#displaythe employee information in the required format
def employeeFormatedInfo(name, ssn, phone, email, salary):
    print('')
    print('--------------- {0:s} --------------------'.format(name))
    print('SSN: {0:s}'.format(ssn))
    print('Phone: {0:s}'.format(phone))
    print('Email: {0:s}'.format(email))
    print('Salary: ${0:s}'.format(salary))
    print('------------------------------------------')
    print('')

#view all employees in the system
def viewEmployeeInfo():
    cls()
    print('------------------------------------------')
    print('          View all employees\n')
    print('------------------------------------------\n')
    if(len(employee_info)==0):
        print('No employees entered.\n')
    else:
        for i in range(0, len(employee_info)):
            line = employee_info[i].split(',')
            employeeFormatedInfo(line[0], line[1], line[2], line[3], line[4])
    input('Press any button to go to Main Menu')
    cls()

#add employee
def addEmployee():
    cls()
    print('-------------------------------------------')
    print('            Add Employee')
    print('-------------------------------------------\n')
    try:
        #users can enter employee Name, SSN, Phone, Email and Salary
        name=input('Employee Name: ')
        ssn=input('Employee SSN: ')
        phone=input('Employee phone number: ')
        email=input('Employee email: ')
        salary=input('Employee salary: $')
        line = name +',' +ssn +',' +phone +',' +email +',' +salary
        index = len(employee_info)
        employee_info.insert(index, line)
    except:
        cls()
        addEmployee()
    print('\nEmployee info has been added!!\n')
    print('--------------------------------------------\n')
    try:
        #users can add new employee or return to Main Menu
        option=input('Enter q/Q to return to Main Menu or A to add another employee')
        if option.lower() == 'q':
            cls()
        else:
            cls()
            addEmployee()
    except:
        cls()
        addEmployee()
#display the Main Menu
def printOptions():
    print('--------- Employee Management System -------\n')
    print('There are ({0:2d} ) employees in the system.'.format(len(employee_info)))
    print('--------------------------------------------\n')
    print('1. View all employees\n')
    print('2. Add new employee\n')
    print('3. Search employee by SSN\n')
    print('4. Edit employee information\n')
    #check the user choice
    try:
        answer=int(input('Please enter your choice by number: '))
    except ValueError:
        print('Not a number')
        return 100
    print('--------------------------------------------\n')
    return answer

def searchEmployeeSSN(isForEdit):
    cls()
    print('--------------------------------------------\n')
    print('        Search for Employee by SSN\n')
    print('--------------------------------------------\n')
    if(len(employee_info)==0):
        input('No employee in the list.\n')
        cls()
    else:
        try:
            ssn=input('Enter SSN to search for employee or q/Q to exit to Main : ')
            global employeeSSN
            employeeSSN = ssn
            if ssn.lower() == 'q':
                return 0

        except ValueError:
            searchEmployeeSSN(0)
    for i in range(0, len(employee_info)):
        line = employee_info[i].split(',')
        if(line[1] == ssn):
            global employeeIndex
            employeeIndex = i
            employeeFormatedInfo(line[0], line[1], line[2], line[3], line[4])
            break
        else:
            print('\n       No employees with that SSN.\n')
            return 0
        try:
            if (isForEdit == 0):
                option=input('Enter q/Q to exit or any key to add another employee:')
                if option.lower() == 'q':
                    cls()
                else:
                    searchEmployeeSSN(0)
        except:
            cls()

def editEmployeeInfo():
    cls()
    #reuse the searchEmployeeSSN
    result = searchEmployeeSSN(1)
    if(result != 0):
        name=input('Employee new Name: ')
        phone=input('Employee new phone number: ')
        email=input('Employee new email: ')
        salary=input('Employee new salary: $')
        #delete the old information
        del employee_info[employeeIndex]
        line = name +',' +employeeSSN +',' +phone +',' +email +',' +salary
        #add the new information
        employee_info.insert(employeeIndex, line)
        input('\nEmployee information has been updated.  Please press any key to go to the Main Menu.\n')

while True:
    cls()
    mode = printOptions()
    if mode == 1:
        cls()
        viewEmployeeInfo()
    if mode == 2:
        cls()
        addEmployee()
    if mode == 3:
        cls()
        searchEmployeeSSN()
    if mode == 4:
        cls()
        editEmployeeInfo()

Ответы [ 2 ]

0 голосов
/ 23 февраля 2020

1. Понимание того, что это значит Это ошибка, относящаяся к функции searchEmployeeSSN. аргумент - это значение, переданное функции при ее вызове, поэтому нам нужно посмотреть, где мы вызываем функцию. В Python вы вызываете функцию, записывая ее имя, за которым следуют несколько скобок, например: searchEmployeeSSN(). Так что может быть не так с этим? Аргументы go заключены в квадратные скобки, а сообщение об ошибке говорит о том, что в коде "searchEmployeeSSN()" отсутствует 1 аргумент. Вы определили функцию следующим образом: def searchEmployeeSSN(isForEdit): ... Здесь , searchEmployeeSSN имеет один параметр с именем isForEdit. Когда вы вызываете функцию с аргументом searchEmployeeSSN(5), параметру isForEdit присваивается значение параметра. Вы также можете указать значения по умолчанию для таких параметров, как этот: def searchEmployeeSSN(isForEdit=10): ... Параметры, которым не присвоено значение по умолчанию, называются позиционными аргументами , поскольку они являются только назначенными значениями, основанными на позиции аргумента, переданного функции; в вашем случае isForEdit является первым параметром и, таким образом, ему присваивается значение первого аргумента. Позиционные аргументы требуются, потому что в противном случае Python не будет знать, какое значение им присвоить. Параметры, которым присваивается значение по умолчанию, называются аргументы ключевого слова , поскольку им также можно назначить значение с использованием имени параметра: def f(x, m=5, c=0): return m * x + c f(10) # 50 f(10, 6) # 60 f(10, m=6) # 60 f(10, c=5) # 55 2. Решение вашей проблемы

Я надеюсь, что вы уже видите, что вам нужно сделать. В вашем блоке while True внизу вы вызываете searchEmployeeSSN() без передачи аргументов. Вы должны передать аргумент здесь или изменить функцию так, чтобы она не имела позиционных аргументов.

Я бы также посоветовал использовать логические значения для переменных, которые представляют значения типа да / нет, истина / ложь. В Python вы можете использовать значения True и False.

0 голосов
/ 23 февраля 2020
def searchEmployeeSSN(isForEdit):
searchEmployeeSSN()

Эти две строки противоречивы. Вы определяете, что функция требует параметра, но при этом вызываете его без параметра.

Существует несколько способов исправить это в зависимости от вашей ситуации.

  1. Возможно, проще всего просто передать параметр. Вы уже сделали это в нескольких местах, хотя вы проходите 1 и 0 вместо True и False, что вы можете исправить sh.
  2. Вы также можете дать параметр значение по умолчанию (для наиболее вероятного случая), что-то вроде def searchEmployeeSSN(isForEdit = False):.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...