尝试使用函数对参数求和时出现类型错误

Posted

技术标签:

【中文标题】尝试使用函数对参数求和时出现类型错误【英文标题】:getting a typeerror when trying to sum arguments using a function 【发布时间】:2022-01-07 15:27:50 【问题描述】:

所以我正在使用预算计算器,我遇到了一个错误,我无法添加费用

这是错误:

Traceback (most recent call last):
  File "/home/jason/Documents/budgetcalc/./budgetcalc.py", line 50, in <module>
    totexpenses = exp.expenses(args.expenses)
TypeError: 'int' object is not callable

用于计算的代码:

class Expenses(Budgeter):
    def __init__(self):
        super().__init__()

    def expenses(self, expense_list):
        self.expenses = expense_list
        total = sum(self.expenses)
        return total

# instance 
exp = Expenses()

定义的参数:

parser.add_argument('--expenses', help='n amounts of expenses', nargs='*', type=int)

这是该参数的代码:

if args.expenses:
    totexpenses = exp.expenses(args.expenses)
    # print(f'$income net income')
    print(f'$totexpenses in expenses')

如果需要,这里是完整的代码:

#!/usr/bin/env python

import argparse
import sys

class Budgeter:
    def __init__(self):
        self.wage = 0
        self.netincome = 0
        self.expenses = 0
        self.hours = 0

class Income(Budgeter):
    def __init__(self):
        super().__init__()

    def income(self, wage, hours):
        self.wage = wage
        self.hours = hours
        self.netincome = (float(self.wage) * int(self.hours)) * 4.34
        return self.netincome

class Expenses(Budgeter):
    def __init__(self):
        super().__init__()

    def expenses(self, expense_list):
        self.expenses = expense_list
        total = sum(self.expenses)
        return total
        
parser = argparse.ArgumentParser()

parser.add_argument('--wage', help='enter a wage ($$/hr)')
parser.add_argument('--hours', help='hours per week')
parser.add_argument('--expenses', help='n amounts of expenses', nargs='*', type=int)
parser.add_argument('--interactive', help='get a prompt for easy use', action='store_true')

args = parser.parse_args()

pc_budgeter = Budgeter()
rawinc = Income()
exp = Expenses()

if args.wage and args.hours:
    if int(args.hours) <= 24:
        income = rawinc.income(args.wage, args.hours)

        if args.expenses:
            totexpenses = exp.expenses(args.expenses)
            print(f'$income net income')
            print(f'$totexpenses expenses')

        else:
            print('missing --expenses')
    else:
        print(f'there are only 24 hours in a day not args.hours')
else:
    parser.print_help()

【问题讨论】:

请修剪您的代码,以便更容易找到您的问题。请按照以下指南创建minimal reproducible example。 【参考方案1】:

Budgeter 类定义了一个名为expenses 的整数属性:

class Budgeter:
    def __init__(self):
        self.wage = 0
        self.netincome = 0
        self.expenses = 0

...然后Expenses 类,继承自Budgeter,定义了一个名为expenses 的方法

class Expenses(Budgeter):
    def __init__(self):
        super().__init__()

    def expenses(self, expense_list):

将其中一项重命名为不同的名称。

顺便说一句,子类中不需要__init__,因为它唯一做的就是调用父类__init__,无论如何这是默认行为。

【讨论】:

好吧,我不知道这个名字很重要

以上是关于尝试使用函数对参数求和时出现类型错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我尝试在 MariaDB 数据库上创建此函数(使用点数据类型)时出现此错误?

尝试在运行中调用函数时出现类型错误

创建具有更多参数的函数时出现“函数不存在”错误

当我尝试将函数的参数设置为默认值时出现意外错误

TypeScript 通用函数 - 为数组应用函数时出现“参数不可分配错误”

PLS-00306:调用 'GET_LINE' 时参数的数量或类型错误。在 PL/SQL 中的函数中传递字符串参数时出现此错误