Python 是否有一种方法可以循环给定给函数的每个变量并确定其类型?
所以我试着写一个函数,它接受多个参数,比如a,b,c,其中一些可能是长度X的列表,一些可能是单个值,但这是未知的 然后,该函数应创建参数集a[i]、b[i]、c[i],这些参数集将传递给多处理池。如果为一个变量指定了一个值,则只会对每个参数集重复该值 现在,如果我想循环每个变量,我可以为每个变量编写一个if语句:Python 是否有一种方法可以循环给定给函数的每个变量并确定其类型?,python,python-3.x,Python,Python 3.x,所以我试着写一个函数,它接受多个参数,比如a,b,c,其中一些可能是长度X的列表,一些可能是单个值,但这是未知的 然后,该函数应创建参数集a[i]、b[i]、c[i],这些参数集将传递给多处理池。如果为一个变量指定了一个值,则只会对每个参数集重复该值 现在,如果我想循环每个变量,我可以为每个变量编写一个if语句: def foo(a, b, c): if type(a) == int: # make list of length needed # Repeat f
def foo(a, b, c):
if type(a) == int:
# make list of length needed
# Repeat for each variable
但在实践中,这会很快变得混乱和漫长。我想知道是否有一种更简单的方法来循环输入变量
我希望有类似的事情
def foo(a, b, c):
for variable in foo.__variables__:
if type(variable) == int:
# Make list of length needed
编辑:其他信息
正如Lauro Bravar所指出的,上述问题可以通过将参数作为列表传递来解决。不幸的是,我试图解决的全部问题包括存在多个可选变量,因此这不起作用。因此,我正在寻找更多能在这种情况下解决问题的代码:
def foo(a, b, c, d=None, e=None):
for variable in foo.__variables__:
if variable is not None:
if type(variable) == int:
# Make list of length needed
有没有一种不用**kwarg就可以做到这一点的方法?理想情况下,我希望定义中的所有参数都可见,因为可读性很重要。这将由没有编码经验的学生使用。您可以将参数作为列表传递,并在该列表上迭代
def foo(bar):
for item in bar:
print(type(item))
您可以将参数作为列表传递,并在该列表上迭代
def foo(bar):
for item in bar:
print(type(item))
我能想象的最简单的方法是这样做:
def foo(*args):
for variable in args:
if type(variable) == int:
# Make list of length needed
您不必在函数中定义每个变量,它只是更易于在函数中使用。由于上面的设置,您必须从arg列表中检索所需的参数。例如:
a = args[0]
b = args[1]
c = args[2]
我可以想象,这在可读性方面也更难,但这取决于您的用例。我可以想象的最简单的方法是这样做:
def foo(*args):
for variable in args:
if type(variable) == int:
# Make list of length needed
您不必在函数中定义每个变量,它只是更易于在函数中使用。由于上面的设置,您必须从arg列表中检索所需的参数。例如:
a = args[0]
b = args[1]
c = args[2]
我可以想象,它的可读性也很难,但这取决于您的用例。您可以通过*args传递变量 输出: 输出: 第二次编辑我的答案: 在“注释”部分中,您添加了两个条件: help函数需要返回foo的参数 无法使用*args,因为要创建开放传递方案*args不支持的指定参数的参数集 因此,我的新方法处理内置函数,它返回当前的本地符号表。当在函数中调用局部变量时,它将作为字典返回函数的所有参数及其值。请确保在一开始就调用它,因为在运行时,可能会在函数中创建新的局部变量,最终可能会导致循环 这个怎么样
def foo(a, b, c, d=None, e=None):
foo_arguments = locals()
for variable in foo_arguments:
if foo_arguments[variable] is not None:
if type(foo_arguments[variable]) == int:
print("Detected argument named {} which is an integer of value {:d}"
.format(variable, foo_arguments[variable]))
result = foo([3,4,5], 4, "foo", d=10)
这允许您传递a、b、c和可选的d、e的参数。连同
print(help(foo))
它回来了
Detected argument named b which is an integer of value 4
Detected argument named d which is an integer of value 10
Help on function foo in module __main__:
foo(a, b, c, d=None, e=None)
您可以通过*args传递变量 输出: 输出: 第二次编辑我的答案: 在“注释”部分中,您添加了两个条件: help函数需要返回foo的参数 无法使用*args,因为要创建开放传递方案*args不支持的指定参数的参数集 因此,我的新方法处理内置函数,它返回当前的本地符号表。当在函数中调用局部变量时,它将作为字典返回函数的所有参数及其值。请确保在一开始就调用它,因为在运行时,可能会在函数中创建新的局部变量,最终可能会导致循环 这个怎么样
def foo(a, b, c, d=None, e=None):
foo_arguments = locals()
for variable in foo_arguments:
if foo_arguments[variable] is not None:
if type(foo_arguments[variable]) == int:
print("Detected argument named {} which is an integer of value {:d}"
.format(variable, foo_arguments[variable]))
result = foo([3,4,5], 4, "foo", d=10)
这允许您传递a、b、c和可选的d、e的参数。连同
print(help(foo))
它回来了
Detected argument named b which is an integer of value 4
Detected argument named d which is an integer of value 10
Help on function foo in module __main__:
foo(a, b, c, d=None, e=None)
您可以通过*args和**kwargs传递变量和可选变量:
def foo(*args, **kwargs):
for x in (args + tuple(kwargs.values())):
print(type(x))
您可以通过*args和**kwargs传递变量和可选变量:
def foo(*args, **kwargs):
for x in (args + tuple(kwargs.values())):
print(type(x))
这可以接受任意数量的参数,包括位置参数
def print_keyword_args(*args, **kwargs):
print(kwargs)
print(args)
print_keyword_args(7, 8, [1,2,3], a = 5, b = 4)
输出:
{'a': 5, 'b': 4}
(7, 8, [1, 2, 3])
注意:可选参数包含在kwargs中。这可以包含任意数量的参数,包括位置参数
def print_keyword_args(*args, **kwargs):
print(kwargs)
print(args)
print_keyword_args(7, 8, [1,2,3], a = 5, b = 4)
输出:
{'a': 5, 'b': 4}
(7, 8, [1, 2, 3])
注意:可选参数在kwargs中被捕获。我已经考虑过这一点。问题是,在完整的问题中,我有一些可选参数,如果指定了这些参数,那么应该以完全相同的方式处理它们。我会用这些信息更新问题。我已经考虑过了。问题是,在完整的问题中,我有一些可选参数,如果指定了这些参数,那么应该以完全相同的方式处理它们。我会用这些信息更新这个问题。谢谢你的回答。我已经在问题的上下文中详细阐述了完整的问题,因为涉及到可选参数,我希望避免使用**kwarg,因为理想情况下,我希望每个变量都易于访问。请查找我对答案的更新。性病
I’我肯定你找的不是args?使用**kwarg,您可以将变量的名称与值一起传递。如果需要的话,将其恢复为实际变量是一个单行程序。默认值也没有问题,因为有一组参数,我需要在调用帮助时显示这些参数,并且未命名的变量不会显示。如果没有办法同时获得这两种效果,那么我只能显式地循环它们。谢谢你的回答。我已经在问题的上下文中详细阐述了完整的问题,因为涉及到可选参数,我希望避免使用**kwarg,因为理想情况下,我希望每个变量都易于访问。请查找我对答案的更新。仍然确定*args不是你想要的?使用**kwarg,您可以将变量的名称与值一起传递。如果需要的话,将其恢复为实际变量是一个单行程序。默认值也没有问题,因为有一组参数,我需要在调用帮助时显示这些参数,并且未命名的变量不会显示。如果没有办法同时获得这两种效果,那么我只能显式地循环它们。