如何在Python中传入和传出函数的变量

时间:2018-04-13 21:35:35

标签: python

当我用Python编写函数时,我通常需要将相当多的变量传递给函数。此外,这些函数的输出包含多个变量。为了管理这个变量I / O,我求助于字典数据类型,我将所有输入变量打包到一个字典中以注入一个函数,然后在函数末尾编译另一个字典以返回到主程序。这当然需要另一个解压缩输出字典。

<script src="https://unpkg.com/vue"></script>

<div id="app">
  <div v-for="(listArtist, index) in listArtists" class="col s4 center" id="art">
    <p> {{ listArtist.title_short }}</p>
    <p>{{ listArtist.artist.name }} </p>
    <p>{{ listArtist.album.title }}</p>
    <div id="margin-test">
      <i class="material-icons" @click="fav(listArtist.title,listArtist.album.title,listArtist.artist.name,listArtist.id,listArtist)" v-bind:class="{'active': listArtist.color}">favorite_border</i>
    </div>
  </div>
</div>

随着变量列表的增长,我怀疑这将是处理变量I / O的低效方法。

有人可以建议一种更好,更有效且不易出错的做法吗?

2 个答案:

答案 0 :(得分:3)

您可以利用kwargs解压缩命名变量

def foo(**kwargs):
    kwargs['var1'] = do_something(kwargs['var1'])
    ...
    return kwargs

答案 1 :(得分:3)

如果您发现自己编写了许多对相同数据起作用的函数,则最好的方法是使用类来包含数据。

districtnum

有许多方法可以更轻松地创建这些方法。其中一些包括:

attrs

class Thing:
    def __init__(self, a, b, c):
        var_1 = a
        var_2 = b
        var_3 = c

    # you can then define methods on it

    def foo(self):
        self.var_1 *= self.var_2

# and use it
t = Thing(1, 2, 3)
t.foo()
print(t.var_1)

namedtuples

>>> @attr.s
... class SomeClass(object):
...     a_number = attr.ib(default=42)
...     list_of_numbers = attr.ib(default=attr.Factory(list))
...
...     def hard_math(self, another_number):
...         return self.a_number + sum(self.list_of_numbers) * another_number

数据类

这些不在python中,但是will be added in 3.7。我在这里添加它们,因为它们可能会成为未来的首选工具。