如何在python中创建两个函数的包装?

时间:2012-11-01 00:51:21

标签: python wrapper

我有两个功能。 第一个将为Caesar密码构建一个给定文本的编码器:

def buildCoder(shift):

        lettersU=string.ascii_uppercase
        lettersL=string.ascii_lowercase
        dic={}
        dic2={}

        for i in range(0,len(lettersU and lettersL)):
            dic[lettersU[i]]=lettersU[(i+shift)%len(lettersU)]
            dic2[lettersL[i]]=lettersL[(i+shift)%len(lettersL)]
        dic.update(dic2)
        return dic

第二个将编码器应用于给定的文本:

def applyCoder(text, coder):
        cipherText=''
        for l in text:
            if l in coder:
                l=coder[l]
            cipherText+=l
        return cipherText

问题的第3部分要求我构建一个包装器,但由于我不熟悉编码,所以我不知道如何编写使用这两个函数的包装器。

def applyShift(text, shift):
  """
  Given a text, returns a new text Caesar shifted by the given shift
  offset. Lower case letters should remain lower case, upper case
  letters should remain upper case, and all other punctuation should
  stay as it is.

  text: string to apply the shift to
  shift: amount to shift the text (0 <= int < 26)
  returns: text after being shifted by specified amount.
  """

3 个答案:

答案 0 :(得分:2)

将您的每个功能视为需要某种数据并为您提供不同类型的功能。

buildCoder需要shift,并为您提供coder

applyCoder需要一些text(要编码的字符串)和coder,并为您提供编码字符串。

现在,您想要编写applyShift,这个函数需要shift和一些text,并为您提供编码字符串。

在哪里可以获得编码字符串?仅来自applyCoder。它需要textcoder。我们有text,因为它是给我们的,但我们还需要coder。因此,让我们使用我们提供的coderbuildCoder获取shift

总之,这看起来像:

def applyShift(text, shift):
  # Get our coder using buildCoder and shift
  coder = buildCoder(shift)
  # Now get our coded string using coder and text
  coded_text = applyCoder(text, coder)
  # We have our coded text!  Let's return it:
  return coded_text

答案 1 :(得分:1)

忘记术语“包装”。只需编写另一个function来调用其他两个,然后返回结果。您已经获得了函数签名(其名称及其参数)以及所需结果的描述。所以在函数体中执行以下操作:

  1. 使用buildCoder()参数调用shift并将结果存储在变量coder
  2. 使用您刚刚存储的参数applyCoder()text来调用coder,并将结果存储在cipher_text
  3. 返回cipher_text
  4. 要测试您的函数是否有效,请编写一些运行applyShift的测试代码,其中包含一些示例数据,例如:

    print applyShift('Loremp Ipsum.', 13)
    

答案 2 :(得分:0)

def applyShift(text, shift):
    return applyCoder(text, buildCoder(shift))