在Python中,优雅地检查函数参数是否均为数字类型可以通过多种方式实现。以下是几种常见的方法:
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
isinstance()
和 (int, float)
如果你只关心 int
和 float
类型,可以直接使用 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
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
try-except
块如果你想更灵活地处理不同类型的数字(例如 decimal.Decimal
或 fractions.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
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
int
和 float
,方法2和方法3是最简单的。decimal.Decimal
或 fractions.Fraction
),方法1和方法4更合适。根据你的具体需求选择合适的方法。