【问题标题】:Pickle in Python, how to check if variable is a string or a pickle?Python中的Pickle,如何检查变量是字符串还是pickle?
【发布时间】:2017-10-12 07:36:42
【问题描述】:

我通过网络发送和接收不同的对象。在我的应用程序中,服务器可以接收泡菜或字符串。有什么方法可以知道我得到的数据是泡菜还是字符串?

我试过了:

class C:
    pass


if __name__ == "__main__":

    c = C()

    data = pickle.dumps(c)
    key = 'cryptokey'

    print isinstance(data, basestring)
    print isinstance(key, basestring)

    print type(data)
    print type(key)

但输出没有帮助,它显示:

True
True
<type 'str'>
<type 'str'>

所以它似乎对泡菜和字符串一视同仁。有任何想法吗?

【问题讨论】:

  • 泡菜是一串二进制数据作为字符串。
  • 更改数据格式以减少歧义。
  • Pickle 以特定的协议和版本标签开头。但更明智 - 注释您的数据,以便接收者知道他们得到的是泡菜、字符串还是黄瓜。
  • @pvg:只有协议 2 及更高版本有该标签。
  • @pvg:仅在 Python 3 上,这不是问题中示例代码使用的版本。

标签: python string types pickle isinstance


【解决方案1】:
try:
    pickle.loads(key)
    print 'Pickled data'
except:
    print 'Not a pickled data'

【讨论】:

  • 这会为任何看起来像泡菜但不打算成为泡菜的字符串提供误报。例如,'N.'
  • 此外,它还允许人们执行任意 Python 代码,例如 __import__('os').system('email my database to Nigeria'),如果他们可以恰到好处地影响消息的内容。
  • 这就是pickle的问题,无论何时加载数据都会出现这种情况,而不仅仅是这里。
【解决方案2】:

对于 python 3,由于pickle.dumps 的结果不是字节对象,因此不再是这种情况:

In [1]: import pickle                                                    

In [2]: test = 'mystring'                                                

In [3]: pickle.dumps(test)                                               
Out[3]: b'\x80\x03X\x08\x00\x00\x00mystringq\x00.'

In [4]: isinstance(_3,str)                                               
Out[4]: False

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    相关资源
    最近更新 更多