Python Pickle问题

2024-06-01 06:28:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我们已经给出了一个任务,并且在执行它时显示了一个错误,为此我们编写了下面的代码。所以泡菜中的问题需要帮助。请让我们知道编码哪里出错了-

import os
import builtins
import pickle
import sys
sys.tracebacklimit=0
import traceback
import io
from logging import Logger

safe_builtins = {
        'range',
        'complex',
        'set',
        'frozenset',
        }

class RestrictedUnpickler(pickle.Unpickler):

      def find_class(self, module, name):
      # Only allow safe classes from builtins.
       if module == "builtins" and name in safe_builtins:
           return getattr(builtins, name)
        # Forbid everything else.
       raise pickle.UnpicklingError("global '%s.%s' is forbidden" %
       (module, name))
    
    def restricted_loads(s):
        """Helper function analogous to pickle.loads()."""
        return RestrictedUnpickler(io.BytesIO(s)).load()
    
    def func1(a): 
      try: 
        x= restricted_loads(pickle.dumps(a))
          return x 
            except pickle.UnpicklingError : 
      s=traceback.format_exc()
         return s
    
    
    def func2(s):
      try:
        x=restricted_loads(pickle.dumps(s))
        return s[x]
      except pickle.UnpicklingError :
 s=traceback.format_exc()
        return s
    
       
    if __name__ == "__main__":
        a=range(int(input())) 
        b=func1(a)
        print(b)
        y=tuple(input())
        z=func2(y)
        print(z)

我们假设问题出在函数2上。我们没有得到正确的输出。函数1工作得很好,这就是为什么我们得到了一些输出。我们还附上了问题陈述的图像,即我们需要在不同功能中执行的操作

请指出我们错在哪里

TypeError: tuple indices must be integers or slices, not tuple

Input (stdin)
50 
"a", "b", "c", "d", "e", "f", "g", "h"

Your Output (stdout) 
range(0, 50)

Expected Output 
range(0, 50) 
Traceback (most recent call last): 
_pickle.UnpicklingError: global 'builtins.slice' is forbidden

Problem Statement


Tags: nameimportreturndefsysrangepicklesafe
2条回答
#frescoplay pickle problem 
import os
import builtins
import pickle
import sys
sys.tracebacklimit=0
import traceback
import io
from logging import Logger

safe_builtins = {
        'range',
        'complex',
        'set',
        'frozenset',
        }

class RestrictedUnpickler(pickle.Unpickler):

   def find_class(self, module, name):
    # Only allow safe classes from builtins.
      if module == "builtins" and name in safe_builtins:
          return getattr(builtins, name)
    # Forbid everything else.
      raise pickle.UnpicklingError("global '%s.%s' is forbidden" %
      (module, name))
        
        

def restricted_loads(s):
        """Helper function analogous to pickle.loads()."""
        return RestrictedUnpickler(io.BytesIO(s)).load()

def func1(a): 
    try: 
        x= restricted_loads(pickle.dumps(a))
        return x 
    except pickle.UnpicklingError : 
        s=traceback.format_exc()
        return s
    
    
def func2(s):
    try:
        x=restricted_loads(pickle.dumps(slice(s)))
        return s[x]
    except pickle.UnpicklingError :
        s=traceback.format_exc()
        return s

    
if __name__ == "__main__":
       a=range(int(input`enter code here`())) 
       b=func1(a)
       print(b)
       y=tuple(input())
       z=func2(y)
       print(z)

在func2中,写入 x=受限的_加载(pickle.dumps(切片)))

相关问题 更多 >