2

I'm working on a web application, using Google App Engine and Python as the backend language. Also, I'm using Jinja2 templating engine to render the HTML pages.

Now, while using the render() function to pass in data into a web page, the count of the parameters that we need to pass into the render() function exceeds well past 255 arguments. And it seems that that's the maximum number of parameters that the render() function can take at a time.

Here's the code of the handler wherein I use the render() function to pass in more than 255 arguments (only 241 right now, other parameters are being commented out for now):

self.render("fourthyear.html" ,gadq111=gadq111,gadq112=gadq112,gadq113=gadq113,gadq114=gadq114,gadq115=gadq115,gadq116=gadq116,gadq117=gadq117,
                                       gadq121=gadq121,gadq122=gadq122,gadq123=gadq123,gadq124=gadq124,gadq125=gadq125,gadq126=gadq126,gadq127=gadq127,
                                       gadq131=gadq131,gadq132=gadq132,gadq133=gadq133,gadq134=gadq134,gadq135=gadq135,gadq136=gadq136,gadq137=gadq137,
                                       gadq141=gadq141,gadq142=gadq142,gadq143=gadq143,gadq144=gadq144,gadq145=gadq145,gadq146=gadq146,gadq147=gadq147,
                                       gadq151=gadq151,gadq152=gadq152,gadq153=gadq153,gadq154=gadq154,gadq155=gadq155,gadq156=gadq156,gadq157=gadq157,
                                       nbaq111=nbaq111,nbaq112=nbaq112,nbaq113=nbaq113,nbaq114=nbaq114,nbaq115=nbaq115,nbaq116=nbaq116,nbaq117=nbaq117,
                                       nbaq121=nbaq121,nbaq122=nbaq122,nbaq123=nbaq123,nbaq124=nbaq124,nbaq125=nbaq125,nbaq126=nbaq126,nbaq127=nbaq127,
                                       nbaq131=nbaq131,nbaq132=nbaq132,nbaq133=nbaq133,nbaq134=nbaq134,nbaq135=nbaq135,nbaq136=nbaq136,nbaq137=nbaq137,
                                       nbaq141=nbaq141,nbaq142=nbaq142,nbaq143=nbaq143,nbaq144=nbaq144,nbaq145=nbaq145,nbaq146=nbaq146,nbaq147=nbaq147,
                                       nbaq151=nbaq151,nbaq152=nbaq152,nbaq153=nbaq153,nbaq154=nbaq154,nbaq155=nbaq155,nbaq156=nbaq156,nbaq157=nbaq157,
                                       soeie111=soeie111,soeie112=soeie112,soeie113=soeie113,soeie114=soeie114,soeie115=soeie115,soeie116=soeie116,soeie117=soeie117,
                                       soeie121=soeie121,soeie122=soeie122,soeie123=soeie123,soeie124=soeie124,soeie125=soeie125,soeie126=soeie126,soeie127=soeie127,
                                       soeie131=soeie131,soeie132=soeie132,soeie133=soeie133,soeie134=soeie134,soeie135=soeie135,soeie136=soeie136,soeie137=soeie137,
                                       soeie141=soeie141,soeie142=soeie142,soeie143=soeie143,soeie144=soeie144,soeie145=soeie145,soeie146=soeie146,soeie147=soeie147,
                                       soeie151=soeie151,soeie152=soeie152,soeie153=soeie153,soeie154=soeie154,soeie155=soeie155,soeie156=soeie156,soeie157=soeie157,
                                       obmd111=obmd111,obmd112=obmd112,obmd113=obmd113,obmd114=obmd114,obmd115=obmd115,obmd116=obmd116,obmd117=obmd117,
                                       obmd121=obmd121,obmd122=obmd122,obmd123=obmd123,obmd124=obmd124,obmd125=obmd125,obmd126=obmd126,obmd127=obmd127,
                                       obmd131=obmd131,obmd132=obmd132,obmd133=obmd133,obmd134=obmd134,obmd135=obmd135,obmd136=obmd136,obmd137=obmd137,
                                       obmd141=obmd141,obmd142=obmd142,obmd143=obmd143,obmd144=obmd144,obmd145=obmd145,obmd146=obmd146,obmd147=obmd147,
                                       obmd151=obmd151,obmd152=obmd152,obmd153=obmd153,obmd154=obmd154,obmd155=obmd155,obmd156=obmd156,obmd157=obmd157,
                                       obhod111=obhod111,obhod112=obhod112,obhod113=obhod113,obhod114=obhod114,obhod115=obhod115,obhod116=obhod116,obhod117=obhod117,
                                       obhod121=obhod121,obhod122=obhod122,obhod123=obhod123,obhod124=obhod124,obhod125=obhod125,obhod126=obhod126,obhod127=obhod127,
                                       obhod131=obhod131,obhod132=obhod132,obhod133=obhod133,obhod134=obhod134,obhod135=obhod135,obhod136=obhod136,obhod137=obhod137,
                                       obhod141=obhod141,obhod142=obhod142,obhod143=obhod143,obhod144=obhod144,obhod145=obhod145,obhod146=obhod146,obhod147=obhod147,
                                       obhod151=obhod151,obhod152=obhod152,obhod153=obhod153,obhod154=obhod154,obhod155=obhod155,obhod156=obhod156,obhod157=obhod157,
                                       oorav111=oorav111,oorav112=oorav112,oorav113=oorav113,oorav114=oorav114,oorav115=oorav115,oorav116=oorav116,oorav117=oorav117,
                                       oorav121=oorav121,oorav122=oorav122,oorav123=oorav123,oorav124=oorav124,oorav125=oorav125,oorav126=oorav126,oorav127=oorav127,
                                       oorav131=oorav131,oorav132=oorav132,oorav133=oorav133,oorav134=oorav134,oorav135=oorav135,oorav136=oorav136,oorav137=oorav137,
                                       oorav141=oorav141,oorav142=oorav142,oorav143=oorav143,oorav144=oorav144,oorav145=oorav145,oorav146=oorav146,oorav147=oorav147,
                                       oorav151=oorav151,oorav152=oorav152,oorav153=oorav153,oorav154=oorav154,oorav155=oorav155,oorav156=oorav156,oorav157=oorav157)
"""oorad111=oorad111,oorad112=oorad112,oorad113=oorad113,oorad114=oorad114,oorad115=oorad115,oorad116=oorad116,oorad117=oorad117,
                                       oorad121=oorad121,oorad122=oorad122,oorad123=oorad123,oorad124=oorad124,oorad125=oorad125,oorad126=oorad126,oorad127=oorad127,
                                       oorad131=oorad131,oorad132=oorad132,oorad133=oorad133,oorad134=oorad134,oorad135=oorad135,oorad136=oorad136,oorad137=oorad137,
                                       oorad141=oorad141,oorad142=oorad142,oorad143=oorad143,oorad144=oorad144,oorad145=oorad145,oorad146=oorad146,oorad147=oorad147,
                                       oorad151=oorad151,oorad152=oorad152,oorad153=oorad153,oorad154=oorad154,oorad155=oorad155,oorad156=oorad156,oorad157=oorad157,
                                       cico111=cico111,cico112=cico112,cico113=cico113,cico114=cico114,cico115=cico115,cico116=cico116,cico117=cico117,
                                       cico121=cico121,cico122=cico122,cico123=cico123,cico124=cico124,cico125=cico125,cico126=cico126,cico127=cico127,
                                       cico131=cico131,cico132=cico132,cico133=cico133,cico134=cico134,cico135=cico135,cico136=cico136,cico137=cico137,
                                       cico141=cico141,cico142=cico142,cico143=cico143,cico144=cico144,cico145=cico145,cico146=cico146,cico147=cico147,
                                       cico151=cico151,cico152=cico152,cico153=cico153,cico154=cico154,cico155=cico155,cico156=cico156,cico157=cico157,
                                       so111=so111,so112=so112,so113=so113,so114=so114,so115=so115,so116=so116,so117=so117,
                                       so121=so121,so122=so122,so123=so123,so124=so124,so125=so125,so126=so126,so127=so127,
                                       so131=so131,so132=so132,so133=so133,so134=so134,so135=so135,so136=so136,so137=so137,
                                       so141=so141,so142=so142,so143=so143,so144=so144,so145=so145,so146=so146,so147=so147,
                                       so151=so151,so152=so152,so153=so153,so154=so154,so155=so155,so156=so156,so157=so157"""  

Is there a way by which I can pass in more than 255 arguments into the render() function ? Our application pretty much needs every single one of those parameters to work as intended. Any alternatives for this problem would do as well.

Edit:

I forgot to include the render() function. It's not a pre-defined function.

class Handler(webapp2.RequestHandler):
    def write(self, *a, **kw):
        self.response.out.write(*a, **kw)
    def render_str(self, template, **params):
        t = jinja_env.get_template(template)
        return t.render(params)
    def render(self, template, **kw):
        self.write(self.render_str(template, **kw))
Manas Chaturvedi
  • 5,210
  • 18
  • 52
  • 104
  • I assume `render()` is a pre-defined function that you can't change? Otherwise I'd suggest passing an object or three. – TheSoundDefense Jul 19 '14 at 02:37
  • @TheSoundDefense I forgot to include the render function ! I have edited my original post to include the class where the function is defined. – Manas Chaturvedi Jul 19 '14 at 02:41
  • you may want to look at the answers to this question, especially from Martijn: http://stackoverflow.com/questions/18550270/any-way-to-bypass-namedtuple-255-arguments-limitation You can do some tricks to bypass the limitation. You could send it a generator, for example. – TheSoundDefense Jul 19 '14 at 02:44
  • What problem are you trying to solve? What's the "I think I need to pass more than 255 paramaters so that I can ..." problem? – Dave W. Smith Jul 19 '14 at 03:24
  • 3
    I think there is something very wrong with the design of your application if you need more than 255 parameters to a function. – Daniel Roseman Jul 19 '14 at 11:54

1 Answers1

3

Python itself cannot pass more than 255 positional arguments to a function. But that limit doesn't exist for keyword-expanded arguments.

self.render("fourthyear.html", **{'gadq111': gadq111, 'gadq112': gadq112, ...})
Ignacio Vazquez-Abrams
  • 776,304
  • 153
  • 1,341
  • 1,358