插件窝 干货文章 如何优雅地在Python中检查函数参数是否均为数字类型?

如何优雅地在Python中检查函数参数是否均为数字类型?

numbers 方法 args print 561    来源:    2025-03-15

在Python中,优雅地检查函数参数是否均为数字类型可以通过多种方式实现。以下是几种常见的方法:

方法1:使用 isinstance()numbers.Number

Python 的 numbers 模块提供了一个抽象基类 Number,可以用来检查一个对象是否是数字类型。

import numbers

def are_all_numbers(*args):
    return all(isinstance(arg, numbers.Number) for arg in args)

# 示例
print(are_all_numbers(1, 2.5, 3))  # True
print(are_all_numbers(1, '2', 3))  # False

方法2:使用 isinstance()(int, float)

如果你只关心 intfloat 类型,可以直接使用 isinstance() 检查这两种类型。

def are_all_numbers(*args):
    return all(isinstance(arg, (int, float)) for arg in args)

# 示例
print(are_all_numbers(1, 2.5, 3))  # True
print(are_all_numbers(1, '2', 3))  # False

方法3:使用 type()in 检查

你也可以使用 type() 函数来检查参数的类型是否在 (int, float) 中。

def are_all_numbers(*args):
    return all(type(arg) in (int, float) for arg in args)

# 示例
print(are_all_numbers(1, 2.5, 3))  # True
print(are_all_numbers(1, '2', 3))  # False

方法4:使用 try-except

如果你想更灵活地处理不同类型的数字(例如 decimal.Decimalfractions.Fraction),可以使用 try-except 块来尝试将参数转换为数字类型。

def are_all_numbers(*args):
    try:
        [float(arg) for arg in args]
        return True
    except (ValueError, TypeError):
        return False

# 示例
print(are_all_numbers(1, 2.5, 3))  # True
print(are_all_numbers(1, '2', 3))  # True (因为 '2' 可以转换为 float)
print(are_all_numbers(1, 'two', 3))  # False

方法5:使用 inspect 模块

如果你需要检查函数的所有参数是否都是数字类型,可以使用 inspect 模块来获取函数的参数并进行检查。

import inspect
import numbers

def are_all_numbers(func, *args, **kwargs):
    sig = inspect.signature(func)
    bound_args = sig.bind(*args, **kwargs)
    bound_args.apply_defaults()
    return all(isinstance(arg, numbers.Number) for arg in bound_args.arguments.values())

# 示例函数
def example_func(a, b, c):
    pass

print(are_all_numbers(example_func, 1, 2.5, 3))  # True
print(are_all_numbers(example_func, 1, '2', 3))  # False

总结

  • 如果你只需要检查 intfloat,方法2和方法3是最简单的。
  • 如果你需要支持更广泛的数字类型(如 decimal.Decimalfractions.Fraction),方法1和方法4更合适。
  • 方法5适用于需要检查函数参数的情况。

根据你的具体需求选择合适的方法。