嗨,我在python中创建了一个程序,我遇到了我认为可能是不专业的做法。所以我知道全局变量几乎从来都不是答案或好消息。但是在这里考虑这个函数。
方法1:
def api_call_function(player_name):
base_api = "https://secure.runescape.com/m=hiscore_oldschool/index_lite.ws?player="
api_call = requests.get(base_api+player_name)
return api_call.text
想象一下,这个函数嵌套在相当多的函数中,并且该函数在一定程度上定期运行,因此将base_api变量作为参数传递需要将其作为参数传递给许多函数才能达到这一点。
由于Python的垃圾收集器是动态工作的,每次将基本api字符串分配给一个变量都会浪费内存和GC时间。因此,我的其他选项不是将它分配给变量,而是将它包含在请求调用中,例如下面的代码片段。
方法2:
def api_call_function(player_name):
api_call = requests.get("https://secure.runescape.com/m=hiscore_oldschool/index_lite.ws?
player="+player_name)
return api_call.text
这种做法不好吗?还是一团糟?
如果我使用另一个选项,让程序在Class对象的范围内运行,那么我可以将base_api字符串分配给静态类变量,而不是使用全局变量或此方法来存储base_api因为程序将在类的范围内,所以它将能够访问基本api,比如这样。
方法3:
class Program:
base_api = "https://secure.runescape.com/m=hiscore_oldschool/index_lite.ws?player="
def api_call_function(player_name):
api_call = requests.get(Program.base_api+player_name)
return api_call.text
类似的东西。
遇到这种情况时,最佳做法是什么
提前感谢您对最佳实践的深入了解。
我的建议是保留方法1或使用全局常量。
首先,指出一个错误:
由于Python垃圾收集器是动态工作的,每次将基本api字符串分配给变量都会浪费内存和GC时间。
不,不会。这里我随意写一个函数作为例子:
def method_1(player_name):
base_api = "https://secure.runescape.com/m=hiscore_oldschool/index_lite.ws?player="
return base_api + player_name
检查已编译的字节码(我的版本是Python 3.10.8(:
>>> dis(method_1)
2 0 LOAD_CONST 1 ('https://secure.runescape.com/m=hiscore_oldschool/index_lite.ws?player=')
2 STORE_FAST 1 (base_api)
3 4 LOAD_FAST 1 (base_api)
6 LOAD_FAST 0 (player_name)
8 BINARY_ADD
10 RETURN_VALUE
请注意,这里使用LOAD_CONST
指令来加载字符串,这意味着这里可以进行一些优化。事实上,它只生成一次字符串并将其存储在function.__code__.co_consts
:中
>>> method_1.__code__.co_consts
(None, 'https://secure.runescape.com/m=hiscore_oldschool/index_lite.ws?player=')
因此,你的担心是没有必要的。您可以放心地在函数中使用常量。
另一个可能的选择也与您的想法相反:
全局变量几乎从来都不是答案或好消息
全局变量确实不是一个好选择,但Python中的字符串对象是不可变的。因此,只要在函数中不使用全局语句,全局字符串对象就相当于全局常量,使用它不会损害程序。您可以将它们存储在当前命名空间中,也可以使用另一个模块来存储全局常量,具体取决于您自己。
有关更多信息,请参阅为什么全局变量是邪恶的?。