2016-11-21 72 views
1

如果我将城市列表作为变量传递,那么任务按预期完成。Python - 干净地传递参数

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

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

如果我错类型的函数定义参数名称,则任务完成还,因为tweet_set变量是全球性的。

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

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

感觉好像没有正确传递参数是错误的。我有两个问题:

  • 在第一个版本中,参数是否正确传递?
  • 我可以确保正确传递参数的方式是什么?
+5

对于全局变量,不要使用与局部变量相同的名称。那么这个问题就不会发生。 – kindall

+0

如果您使用PyCharm或类似的IDE,它会告诉您何时自动执行此操作。 – Alex

+1

@kindall第二个函数的问题不在于他为全局和本地使用了相同的名称,而是因为'for'循环没有使用它应该使用的局部变量。 – Barmar

回答

3

参数是否正确传递?

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

什么方式

在模块化的理念,为您不能有效地防止这样的问题:你的功能不允许知道什么外部。这就是“纯粹”模块化编程和Python特性有点不一致的地方。

作为一名程序员,确保这一点的方法是使用不易碰撞的变量名称。在这种情况下,请将测试驱动程序(您的主程序)中的名称tweet_set更改为其他名称。如果这是一个常规测试用例,请使用不太可能出现在函数中的名称,例如TEST_DRIVER_tweet_set

编程实践

您可以使用搜索功能,在编辑器中选择显示的每个名字的所有地方。如果依次突出显示每个参数和变量名称并“查找所有”,则可以看到哪些字符没有正确输入。

先进技术 ...只是让你知道的“有一天” ......

有Python的功能,让功能看进栈,抓住下一个函数的栈帧(一个叫这个),并检查它的活动变量。如果您确实需要这样做,您可以让函数根据每个堆栈帧中的变量名称检查自己的参数名称,直到操作系统中的主程序。

很少有情况下这是有用的。

2

有检查的一个简单的方法:

>>> 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它,不管名称是什么的全球。这是因为解释器首先到本地堆栈检查变量(它是一个引用的原因是因为函数参数的行为),然后才引用全局变量。

1

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

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() 

,如果你在​​定义拼错了参数名称,这将抛出一个NameError