代码之家  ›  专栏  ›  技术社区  ›  Mittenchops

在python中,通过定义的散列调用函数,而不是使用一个愚蠢的人类名字

  •  0
  • Mittenchops  · 技术社区  · 5 年前

    能够

    我有大约10亿个解析器函数,我给它们起了名字,比如:

    def parser1(x):
      do_stuff(x)
    
    def parserN(x,y):
      do_other_stuff(x,y)
    

    我打电话给:

    >>> result = parser1(x)
    

    这个命名法意味着代码库不够漂亮,但它是有效的。如果我写一个新的解析器,我只增加我的文件,并希望我计数正确,没有做任何错误来覆盖现有的东西,等等。

    然而,我喜欢用某种方式来称呼它们,而不是用我给它们起的名字,一个我必须用我愚蠢的人脑想出的名字,而是根据某种机器生成的名字,从 函数的。

    例如,我的理想是:

    parser1 = """def func(x):
      do_stuff()"""
    
    print(hashlib.md5(parser1.encode('utf-8')).hexdigest())
    
    >>> print(hashlib.md5(parser1.encode('utf-8')).hexdigest())
    "2cb3fed66c79bc14eb442afad27651c8"
    
    >>> result = __2cb3fed66c79bc14eb442afad27651c8(x)
    

    例如,可以将这些md5fun存储在映射到其实现的字典中,然后可以对它们进行迭代,或者根据某些逻辑应用它们,甚至可能是来自映射中其他md5fun的逻辑。

    加分是因为,不仅使用函数字符串表示的md5,而且使用函数AST的md5,以便:

    def parser1(x):
      a = 1
      do_stuff(x) + a
    

    def parser2(y):
      b = 1
      do_stuff(y) + b
    

    1 回复  |  直到 5 年前
        1
  •  1
  •   DeepSpace    5 年前

    这样做的一个非常粗糙和肮脏的方法是(好吧,这整个想法是粗糙和肮脏的)

    import hashlib
    
    def add_md5_to_globals(f):
        # Python names can't start with a number
        md5 = '_' + hashlib.md5(f.__code__.co_code).hexdigest()
        globals()[md5] = globals().pop(f.__name__)
    
    
    def f(x):
        print(x)
    
    
    add_md5_to_globals(f)
    
    _123fdffc617d4a2514f219cdd26487a3('but why')
    # but why
    

    这种方法要求您:

    • def f add_md5_to_globals 被称为 'f' 没有意义,可以重复使用。

    • 了解要调用的函数的md5(例如, _123fdffc617d4a2514f219cdd26487a3('but why') ).

    如果你不介意用 globals() md5 将“md5”添加到“全局” 然后用它来调用每个函数:

    latest_md5 = add_md5_to_globals(f)
    globals()[latest_md5]('but why')
    # but why