Python干净地传递参数

2024-06-18 08:03:51 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我将城市列表作为变量传递,那么任务将按预期完成。在

def count_top_rt(tweet_set):
    for tweet in tweet_set:
        print(tweet)

tweet_set = ["Sydney", "London", "Paris"]
print(tweet_set)

如果我在函数定义中输入错误的参数名,那么任务仍然完成,因为tweet_set变量是全局变量。在

^{pr2}$

感觉不恰当地传递论点是错误的。我有两个问题:

  • 在第一个版本中,参数是否正确传递?在
  • 我有什么方法可以确保正确传递论点?在

Tags: in列表for参数topdefcount错误
3条回答

参数是否正确传递?

是的,在第一个示例中参数被正确传递:例程只依赖于输入参数。在

有什么方法

在模块化哲学中,你不能有效地防止这个问题:你的功能不允许知道任何外部的东西。这就是“纯”模块化编程和Python特性有点不一致的地方。在

作为程序员,确保这一点的方法是使用不太可能发生冲突的变量名。在这种情况下,将测试驱动程序(主程序)中的tweet_set的名称改为其他名称。如果这是一个长期测试用例,请使用一个不太可能出现在函数中的名称,例如test_DRIVER_tweet_set。在

编程实践

您可以使用编辑器中的搜索功能来突出显示每个名称的所有匹配项。如果依次突出显示每个参数和变量名并“find all”,则可以看到哪些参数和变量没有正确键入。在

先进技术。。。只是为了让你知道“有一天”。。。在

Python的一些特性允许函数查看堆栈,获取下一个函数(调用此函数的函数)的堆栈帧,并检查其活动变量。如果你真的,真的需要这样做,你可以让你的函数检查自己的参数名与每个堆栈帧中的变量名,一直到操作系统中的主程序。在

很少有这样的情况。在

有一种简单的检查方法:

>>> def count_top_rt(tweet_set):
...     print(id(tweet_set))
...     for tweet in tweet_set:
...             print(tweet)

>>> tweet_set = ["Sydney", "London", "Paris"]
>>> count_top_rt(tweet_set)
1951490534472
Sydney
London
Paris
>>> id(tweet_set)
1951490534472

>>> tweet_set2 = ["Sydney", "London", "Paris"]
>>> count_top_rt(tweet_set2)
1951490565832
Sydney
London
Paris
>>> id(tweet_set2)
1951490565832

如您所见,当一个变量作为变量传递时,无论全局变量的名称是什么,局部变量都将成为它的reference。这是因为解释器首先去局部变量堆栈检查变量(它是引用的原因是因为函数的参数行为),然后才引用全局变量。在

防止这种情况发生的最好方法是避免全局变量。将所有代码放入函数和类中。在

def count_top_rt(tweet_set):
    for tweet in tweet_set:
        print(tweet)

def main():
    tweet_set = ["Sydney", "London", "Paris"]
    count_top_rt(tweet_set)

main()

如果您在count_top_rt的定义中拼错了参数名,则会抛出一个NameError。在

相关问题 更多 >