【问题标题】:GAE TypeError: not enough arguments for format stringGAE TypeError:格式字符串的参数不足
【发布时间】:2012-06-11 13:14:03
【问题描述】:

我正在尝试使用 Python 在 Google App Engine 中编写我的第一个应用程序。这里是应用程序的链接:http://contractpy.appspot.com/ - 这只是一个实验性应用程序。整个代码如下。

但我收到此错误(显示在日志中):

(...) line 229, in post "owner":owner})
TypeError: not enough arguments for format string

第 229 行在这个 if 块中:

if (resident_name and valid_resident(resident_name)) \
        and (user_SSN and valid_SSN(user_SSN)) \
        and ((not user_email) or (user_email and valid_email(user_email))):
            self.redirect('/welcome?resident=%s&nacionality=%s?SSN=%s?driverLicense=%s?email=%s?witness =%s?owner=%s' % {"resident":resident_name,
                                      "nacionality":user_nacionality,
                                      "SSN":user_SSN,
                                      "driverLicense":user_driverLicense,
                                      "email":user_email,
                                      "witness ":witness ,
                                      "owner":owner})

更具体地说,就是这一行:

"owner":owner})

我尝试进行更改,阅读了类似的 awnswers,但没有任何效果。 有人可以找出导致此错误的原因吗? 提前感谢您的帮助!

# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
#!/usr/bin/env python
#
# Copyright 2007 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

import webapp2

form = """

<html>
  <head>
    <title>Sign Up</title>
    <style type="text/css">
      .label {text-align: right}
      .error {color: red}
    </style>

  </head>

  <body>
    <h2>Signup</h2>
    <form method="post">
      <table>
        <tr>
          <td class="label">
            resident
          </td>
          <td>
            <input type="text" name="resident" value= "%(resident)s">
          </td>
          <td class="error"> %(resident_error)s

          </td>
        </tr>

         <tr>
          <td class="label">
            nacionality
          </td>
          <td>
            <input type="text" name="nacionality" value= " ">
          </td>
        </tr>

        <tr>
          <td class="label">
            License
          </td>
          <td>
            <input type="text" name="driverLicense" value="">
          </td>
        </tr>

        <tr>
          <td class="label">
            SSN
          </td>
          <td>
            <input type="text" name="SSN" value="%(SSN)s">
          </td>
          <td class="error"> %(SSN_error)s
          </td>
        </tr>


        <tr>
          <td class="label">
            Email (optional)
          </td>
          <td>
            <input type="text" name="email" value="%(email)s">
          </td>
          <td class="error"> %(email_error)s

          </td>
        </tr>
      </table>

<br>
        <td class="label">
          Contract Type
          <select name = "contractType">
              <option>House  Rental Contract</option>
              <option>Car Rental Contract</option>
              <option>Other</option>
          </select>
          </td>
<br>
<br>

<br>
          owner
          <select name = "owner">
              <option>House owner</option>
              <option>Car owner</option>
              <option>Other owner</option>
          </select>
<br>
<br>

<br>
          Witness
          <select name = "witness">
              <option>Carl Sagan</option>
              <option>Mahatma Gandhi</option>
          </select>
<br>
<br>

      <input type="submit">
    </form>
  </body>

</html>
"""

welcome = """
<html>
  <head>
    <title>Unit 2 Signup</title>
  </head>

  <body>

%(contractType)s

In consideration of the agreements of the Resident(s), known as: %(resident)s The owner hereby rents them the dwelling located at %(residentAdress)s, for the period commencing on the %(dateStarts)s, and monthly thereafter until the last day of %(dateEnds)s, at which time this Agreement is terminated. Resident(s), in consideration of owners permitting them to occupy the above property, hereby agrees to the following terms:

RENT: To pay as rental the sum of $ (rentalSum) per month, due and payable in advance from the first day of every month. Failure to pay rent when due will result in the owner taking immediate legal action to evict the Resident from the premises and seize the security deposit.
LATE FEE: Rent received after the first of the month will be subject to a late fee of 10% plus (3.00) dollars per day.

ACCEPTED THIS (dateContract), at (localContract).

___________________________________________________
%(resident)s - Resident

___________________________________________________
%(owner)s – owner

___________________________________________________
%(witness)s – Witness

  </body>
</html>

"""

import re

USER_RE = re.compile(r"^[a-zA-Z0-9_-]{3,20}$")
def valid_resident(resident):
    return USER_RE.match(resident)

PASS_RE = re.compile(r"^.{3,20}$")
def valid_SSN(SSN):
    return PASS_RE.match(SSN)

EMAIL_RE = re.compile(r"^[\S]+@[\S]+\.[\S]+$")
def valid_email(email):
    return EMAIL_RE.match(email)

def escape_html(s):
    for (i,o) in (("&","&"), (">",">"), ("<","<"), ('"','"')):
        s = s.replace(i,o)
        return s

import time

import datetime

def dateToday():
    today = datetime.datetime.today()
    todayDay = str(today.day)
    todayMonth = str(today.month)
    monthExt = {'1':' January ', '2':'February', '3':' March ', '4':'April', '5':'May', '6':'June', '7 ':' July ', '8':'August', '9':'September', '10':'October', '11':'November ', '12':'December'}
    todayYear = str(today.year)
    return(todayDay + ' of  ' + monthExtenso[todaymonth] + ' of ' + todayYear)

class MainHandler(webapp2.RequestHandler):
    def get(self):
       self.response.out.write(form %{"resident": "",
                                       "SSN": "",
                                       "driverLicense": "",
                                       "email":"",
                                       "resident_error": "",
                                       "SSN_error": "",
                                       "driverLicense_error": "",
                                       "email_error": ""})

    def write_form(self, text_write):
       self.response.out.write(text_write)

    def post(self):
        resident_name = self.request.get(escape_html("resident"))
        user_nacionality = self.request.get("nacionality")
        user_SSN = self.request.get(escape_html('SSN'))
        user_email = self.request.get(escape_html('email'))
        user_driverLicense = self.request.get(escape_html('driverLicense'))
        resident_error = ""
        SSN_error = ""
        driverLicense_error = ""
        contract_type = self.request.get("contractType")
        owner = self.request.get("owner")
        witness  = self.request.get("witness ")

        if (resident_name and valid_resident(resident_name)) \
        and (user_SSN and valid_SSN(user_SSN)) \
        and ((not user_email) or (user_email and valid_email(user_email))):
            self.redirect('/welcome?resident=%s&nacionality=%s?SSN=%s?driverLicense=%s?email=%s?witness =%s?owner=%s' % {"resident":resident_name,
                                      "nacionality":user_nacionality,
                                      "SSN":user_SSN,
                                      "driverLicense":user_driverLicense,
                                      "email":user_email,
                                      "witness":witness,
                                      "owner":owner})
        else:
            if not valid_resident(resident_name):
                resident_error = "Oh no!!! this resident name isn't valid!"
            if not valid_SSN(user_SSN):
                SSN_error = "Oh no!!! SSN isn't valid!"
            if user_email and not valid_email(user_email):
                email_error = "Oh no!!! e-mail isn't valid!"
            self.write_form(form % {"resident":resident_name,
                                      "resident_error":resident_error,
                                      "SSN":user_SSN,
                                      "SSN_error":SSN_error,
                                      "driverLicense":user_driverLicense,
                                      "email":user_email,
                                      })

class WelcomeHandler(webapp2.RequestHandler):
    def get(self):
        geted_resident_name = self.request.get('resident')
        geted_user_nacionality = self.request.get("nacionality")
        geted_user_SSN = self.request.get('SSN')
        geted_user_email = self.request.get('email')
        geted_user_driverLicense = self.request.get('driverLicense')
        geted_resident_error = ""
        geted_SSN_error = ""
        geted_driverLicense_error = ""
        #geted_contract_type = self.request.get("contractType")
        geted_owner = self.request.get("owner")
        geted_witness  = self.request.get("witness ")



        self.response.out.write(welcome % {"resident":geted_resident_name,
                                      "nacionality":geted_user_nacionality,
                                      "SSN":geted_user_SSN,
                                      "SSN_error":geted_SSN_error,
                                      "driverLicense":geted_user_driverLicense,
                                      "email":geted_user_email,
                                      "witness ":geted_witness ,
                                      "owner":geted_owner,
                                      })


app = webapp2.WSGIApplication([('/', MainHandler), ('/welcome', WelcomeHandler)],
                              debug=True)

【问题讨论】:

    标签: python google-app-engine typeerror


    【解决方案1】:

    当您在字符串中有 x 格式参数但您只传递了 y 参数以匹配然后(其中 x > y)时,会导致参数不足。

    在您的情况下,您错过了 %,只需将 s% 更改为 %s。

    self.redirect('/welcome?resident=%s&nacionality=%s?SSN=%s?driverLicense=%s?email=s%?witness =%s?owner=%s' % {"resident":resident_name,
                                          "nacionality":user_nacionality,
                                          "SSN":user_SSN,
                                          "driverLicense":user_driverLicense,
                                          "email":user_email,
                                          "witness ":witness ,
                                          "owner":owner})
    

    【讨论】:

    • 非常感谢,谢伊。确实存在输入错误(“email=s%”)。但我修复了 (%s) 并且消息错误仍然存​​在。任何提示出了什么问题?
    【解决方案2】:

    % 运算符用于字符串格式化时的右手参数必须是元组,而不是字典。在您的情况下,dict 将替换格式字符串中第一次出现的%s,而没有足够的其他对象来替换其他对象。您需要手动构建要用于替换的项目的元组,例如:

    ('/welcome?resident=%s&nacionality=%s?SSN=%s?driverLicense=%s?email=%s?witness =%s?
    owner=%s' % (resident_name, user_nacionality, user_SSN, user_driverLicense, user_email,
    witness, owner)
    

    【讨论】:

    • 有趣...我使用了另一个工作模型应用程序,我认为它使用了字典。但是您的建议修复了错误。谢谢,Wooble!
    猜你喜欢
    • 1970-01-01
    • 2012-06-24
    • 2020-10-17
    • 2019-01-17
    • 2017-12-18
    • 2018-06-07
    • 2020-03-10
    • 2021-04-01
    相关资源
    最近更新 更多