有没有一种方法可以遍历赋予函数的每个变量并确定其类型?

时间:2019-01-14 08:04:07

标签: 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 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的方法?理想情况下,我希望定义中所有可见的参数都具有可读性,因为可读性很重要(编码经验很少的学生会使用它)

5 个答案:

答案 0 :(得分:4)

您可以通过*args

传递变量
def foo(*args):
    for item in args:
        print(type(item))

foo([3,4,5],4,"foo")

出局:

<type 'list'>
<type 'int'>
<type 'str'>

第一次编辑我的答案:

关于您在问题中的其他信息:*args占用您希望的任意数量的参数。遍历*args的所有元素并检查其类型时,可以将结果存储在dictionarylist中以使其可访问:

def foo(*args):
    mylist = list()
    for item in args:
        if type(item) == int:
            mylist.append([item])
        elif type(item) == list:
            mylist.append(item)
    return mylist

result = foo([3,4,5],4,"foo")

出局:

[[3, 4, 5], [4]]

第二次编辑我的答案:

在评论部分,您添加了两个条件:

  1. help()函数需要返回foo的参数
  2. 您无法使用*args,因为您要创建指定参数的参数集(*args不支持开放式传递方案)

因此,我的新方法处理内置函数locals(),该函数返回“当前本地符号表”。在函数中调用locals()时,它将以字典的形式返回函数的所有参数及其值。确保在开始时就调用它,因为在运行时可能会在函数中创建新的本地变量,并且您可能最终陷入循环。

怎么样?

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)

这使您可以传递abcde的自变量。与

一起
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)

答案 1 :(得分:1)

我可以想象的最简单的方法是做这样的事情:

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]

我可以想象这在可读性上也较难,但这取决于您的用例。

答案 2 :(得分:0)

您可以将参数作为列表传递并遍历该列表。

def foo(bar):
    for item in bar:
         print(type(item))

答案 3 :(得分:0)

您可以通过* args和** kwargs传递变量和可选变量:

def foo(*args, **kwargs):
    for x in (args + tuple(kwargs.values())):
        print(type(x))

答案 4 :(得分:0)

这可以包含任意数量的参数,包括位置参数。

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中。