Python 有一个名为
globals
的全局函数,它返回一个字典。
调用
globals()
函数的一些简单示例如下所示:
###########################################################
# width = 5.211
globals()["width"] = 5.211
###########################################################
# height = 11.77
globals()["height"] = 11.77
##########################################################
# surface_area = width * height
g = globals()
g["surface_area"] = g.__getitem__("width") * g.__getitem__("height")]
我们如何为
globals
函数编写包装器?
然后我们如何创建一个可导入的库,这将导致
globals
函数被我们的包装器隐藏?
我为全局变量创建包装器的动机是我希望自己和其他一些人花更多的时间编写实际代码,而花更少的时间阅读 python 解释器打印出的错误消息。
特别是,我自己和其他一些人将驼峰式大小写与仅使用小写字母和下划线的符号混合在一起。
x = surface_area*height
x = surfaceArea*height
# x = globals()["surface_area"] * globals()["height"]
我们可以部分解决这个问题:
class slobals:
"""
SLOPPY GLOBALS
"""
class SlobalKeyError(KeyError):
def __init__(self, vars:list):
"""
ONLY ACCEPTS ONE INPUT ARGUMENT
INPUT ARGUMENT MUST BE A LIST
INPUT ARGUMENT MUST BE A LIST OF STRINGS
"""
self._vars = vars
def globals():
return self._backup_dictionary
def __getitem__(self, label:str):
old_dict = globals()
label = str(label)
if label in old_dict:
return old_dict[label]
else:
# CONVERT TO VARIABLE NAME OR FUNCTION NAME TO ALL LOWER-CASE LETTERS
# FOR EXAMPLE,
# `getUserInput` becomes `getuserinput`
#
# DELETE EVERY INSTANCE OF THE UNDERSCORE CHARACTER `_`
# `get_user_input` becomes `getuserinput`
#
std_label = "".join(ch for ch in label.lower() if ch != "_")
try:
vars = self._backup_dictionary[label]
if len(vars) > 1:
raise self.SlobalKeyError(vars)
else:
except KeyError:
raise self.SlobalKeyError([])
def __call__(the_slowball_klass):
return the_slowball_klass
我认为你们应该选择一种风格并坚持下去,而不是浪费 CPU 时间。
但是您可以只做
args = patch_globals(globals())
并使用args。我不认为你可以覆盖全局变量,这是一个特殊的功能。