python - 如何使用 python3 argparse 将字符串值正确传递给用户定义的函数?
问题描述
我使用割线法编写了一个简短的程序来计算各种公司现金流的内部收益率,这些现金流被定义为可调用函数。每个功能都以公司股票行情代码或史诗命名。该程序使用以下命令行参数运行: ,并使用 argparse 解析命令行参数。示例:python3 SecantMethod.py grg 0.2 0.4 6. 程序运行时会产生“str object is not callable”错误,到目前为止我无法解决。这个问题似乎与 argparse 通过所需的现金流史诗的方式有关。删除所有 argparse 代码并插入一个简单的 print(SecantMethod(roo 0,1 0.2 6)) 语句会导致程序返回正确的速率和迭代值。
import argparse
def SecantMethod(f, x0, x1, d):
c = 0
e = 0.5*pow(10, -d)
while abs(x1 - x0) > e:
if f(x1) - f(x0) == 0:
return 'Division by zero'
x = x1 - f(x1)*(x1 - x0)/(f(x1) - f(x0))
x0, x1 = x1, x
c += 1
return x, c
def grg(x):
return -1000\
+100.00/(1 + x)\
+210.00/(1 + x)**2\
+331.00/(1 + x)**3\
+446.10/(1 + x)**4\
+1610.51/(1 + x)**5
# root = 27.97% (x = 0.27967730)
def roo(x):
return -4000\
+1200/(1 + x)\
+1410/(1 + x)**2\
+1875/(1 + x)**3\
+1050/(1 + x)**4
# root = 14.30% (x = 0.14299344)
def main():
parser = argparse.ArgumentParser(description= 'Solves f(x) = 0, using the secant method.')
parser.add_argument('f', type=str, help='function name')
parser.add_argument('x0', type=float, help='first interval endpoint')
parser.add_argument('x1', type=float, help='second interval endpoint')
parser.add_argument('d', type=int, help='number of decimal places')
args = parser.parse_args()
if args.x0 == args.x1:
print('\nInvalid input: x0 and x1 must be distinct values.')
return
if args.d < 0:
print('\nInvalid input: d must be a positive integer.')
return
# print('\nRoot & number of iterations: ', SecantMethod(roo, 0.1, 0.2, 8))
print('\nRoot & number of iterations: ', SecantMethod(args.f, args.x0, args.x1, args.d))
if __name__ == "__main__":
main()
解决方案
字符串'grg'
与函数不同grg
。
处理此问题的一种方法是提供映射:
valid_functions = {
'grg': grg,
'roo': roo,
}
# ...
SecantMethod(valid_functions[args.f], ...)
推荐阅读
- erlang - Ejabberd 的 CPU 使用率很高,并将非活动用户显示为已连接
- c++ - 如何将对象指针数组的大小初始化为动态大小?
- python - 迭代包含特定行中的字符串的某些列 panas
- c++ - 使用花括号而不是括号时 Visual Studio 中断
- c# - 标题中的 WPF 组框多重绑定
- sql-server-ce - SQL CE Compact Edition 工具箱 OutOfMemoryException
- android - 将给定的字符串转换为 byteArrays
- php - 如何避免记录被 Api-Platform 正确转换为状态代码的预期异常?
- c - Uni 分配 - 写入大小为 1 无效
- c++ - 计算两个相等长度的字符串之间的不同字符数