我们如何围绕名为 `globals` 的内置函数创建包装器?

问题描述 投票:0回答:1

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         
python python-3.x global-variables wrapper user-friendly
1个回答
0
投票

我认为你们应该选择一种风格并坚持下去,而不是浪费 CPU 时间。

但是您可以只做

args = patch_globals(globals())
并使用args。我不认为你可以覆盖全局变量,这是一个特殊的功能。

© www.soinside.com 2019 - 2024. All rights reserved.