[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [GMG-Devel] cyclic imports
From: |
Christopher Allan Webber |
Subject: |
Re: [GMG-Devel] cyclic imports |
Date: |
Fri, 14 Dec 2012 09:46:23 -0600 |
User-agent: |
mu4e 0.9.9-dev6; emacs 24.0.92.1 |
Well, the solution we often use is in the case of some awful cycle,
import inside the function:
def foo():
import mediagoblin.would_cycle
I actually have no idea what the cost of doing imports like this is, but
we definitely love them it seems. ;)
We could refactor... but I'm hesitant to jump in and refactor like
crazy... that could be causing messes to save messes.
Here's an idea I had this morning... warning, it's crazy ("crazy" is the
word of the morning it seems):
#+BEGIN_SRC python
some_module = None
def blah_blah():
_import_stragglers()
some_module.method_call("yeehaw")
STRAGGLERS_IMPORTED = False
def _import_stragglers():
"""
Do any imports that would cause import cycles in this module, if we haven't
already
"""
if STRAGGLERS_IMPORTED is True:
return
import mediagoblin.foo.some_module as some_module_tmp
global some_module
some_module_tmp = some_module
import mediagoblin.foo.another_module as another_module_tmp
global another_module
another_module_tmp = another_module
global STRAGGLERS_IMPORTED
STRAGGLERS_IMPORTED = True
#+END_SRC
However that looks messy, and I can't think of any way to make it less
messy. If only we had lisp macros! ;) I don't know if it's necessary
either... I haven't profiled how long redundant inline imports are.
Otherwise, what's wrong with in-function imports? They work :)
Sebastian Spaeth writes:
> Whenever I modify things, I have to fight cyclic imports in MediaGoblin.
> This is an issue that we really need to think about. Consider this:
>
> I want to give better error message in the case of csrf failures. To do
> so I modify
> GMG.meddlewares.csrf to return a GMG.tools.response:render_error().
>
>
> 1) tools.response imports tools.template to get access to
> render_template()
> 2) tools.template imports meddlewares.csrf to get access to
> render_csrf_token().
> 3) meddlewares.csrf imports tools.response to get access to
> render_error()
> 4) BANG BOOM CRASH. ImportError!
>
> How can we solve this issues in this specific and the general case? Here
> I could imagine to solve/fix this by splitting CSRF into a
> meddlewares.csrf (which does the checking) and a tools.csrf (which does
> the actual rendering of the token). But that would split CSRF
> functionality over 2 files. (we could also put it into tools.template
> rather than tools.csrf).
>
> Sebastian
> _______________________________________________
> devel mailing list
> address@hidden
> http://lists.mediagoblin.org/listinfo/devel