【问题标题】:How can I replace `eval` in my function?如何在我的函数中替换“eval”?
【发布时间】:2014-03-03 19:54:01
【问题描述】:

我很清楚在 Python 中使用 eval 并不是一个好习惯。这是我的代码:

from hashlib import * # added for clarification
def get_hash(self):
        if self.hash_type in ['md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512']:
            data = eval(self.hash_type) # <--- how can I replace this?

我听说过setattr 函数,但我真的不知道如何实现它。

是否也可以使用map 函数来做到这一点?

注意'md5', 'sha1', 'sha224' 等是局部变量。当我在其中一个上使用eval 函数时,它们就变成了函数。

【问题讨论】:

  • 为什么需要 eval 函数?
  • md5sha1 等是什么?全局变量、局部变量、函数?
  • 您认为md5sha1 等是某些对象的名称吗?

标签: python map eval setattr


【解决方案1】:

你可以使用getattr:

import hashlib
if self.hash_type in ['md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512']:
     func = getattr(hashlib, self.hash_type)

【讨论】:

  • 我不敢相信这有多干净。
  • 显然它不起作用:TypeError: setattr expected 3 arguments, got 2.
  • @Deneb 你为什么使用setattr
  • 我应该为此被钉死在十字架上……我在想什么?再次感谢您...我无话可说。
【解决方案2】:

为什么不将所有信息存储在字典中?例如:

self.hash_types = {
    'md5': md5,
    'sha1': sha1,
    ...
}

然后在get_hash:

def get_hash(self):
    if self.hash_type in self.hash_types:
        data = self.hash_types[self.hash_type]

或者,

def get_hash(self):
    data = self.hash_types.get(self.hash_type, self.DEFAULT)

【讨论】:

  • 这似乎也是一个很好的例子。我正在考虑使用字典,但后来我觉得它会使我的代码有点太乱了。
  • 如果您只是想获取数据,我更喜欢这种方式,但是当您实际访问函数时,我觉得 Ashwini 的答案更像 pythonic。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 2021-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多