我正在使用以下课程轻松存储我的歌曲数据.
class Song:
"""The class to store the details of each song"""
attsToStore=('Name', 'Artist', 'Album', 'Genre', 'Location')
def __init__(self):
for att in self.attsToStore:
exec 'self.%s=None'%(att.lower()) in locals()
def setDetail(self, key, val):
if key in self.attsToStore:
exec 'self.%s=val'%(key.lower()) in locals()
Run Code Online (Sandbox Code Playgroud)
我觉得这比写出一个if/else块更具可扩展性.但是,eval似乎被认为是一种不良做法并且使用起来不安全.如果是这样,任何人都可以向我解释为什么并告诉我一个更好的方法来定义上面的类?
所以我花了很多时间在这上面,在我看来它应该是一个简单的修复.我正在尝试使用Facebook的身份验证来注册我的网站上的用户,而我正试图在服务器端进行操作.我已经到了获得访问令牌的地步,当我去的时候:
https://graph.facebook.com/me?access_token=MY_ACCESS_TOKEN
我得到的信息是我正在寻找的字符串,如下所示:
{"id":"123456789","name":"John Doe","first_name":"John","last_name":"Doe","link":"http:\/\/www.facebook.com\/jdoe","gender":"male","email":"jdoe\u0040gmail.com","timezone":-7,"locale":"en_US","verified":true,"updated_time":"2011-01-12T02:43:35+0000"}
看起来我应该能够使用dict(string)这个,但我收到这个错误:
ValueError: dictionary update sequence element #0 has length 1; 2 is required
所以我尝试使用Pickle,但得到了这个错误:
KeyError: '{'
我尝试使用django.serializers反序列化它,但有类似的结果.有什么想法吗?我觉得答案必须简单,我只是愚蠢.谢谢你的帮助!
我在多个地方多次看过这个,但从来没有找到令人满意的解释,为什么会出现这种情况.
所以,希望有人会在这里提出.为什么我们(至少一般)不使用exec()和eval()?
编辑:我看到人们假设这个问题与网络服务器有关 - 它没有.我可以看到为什么传递给unsanitized的字符串exec可能不好.在非网络应用程序中它是坏的吗?