- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Django 中工作。在 Django 中,当您渲染模板时,您向其发送一个上下文字典以进行替换。因为我很懒/干,所以我经常使用 locals() 作为快捷方式,而不是发送看起来像 {'my_var': my_var, 'var2': var2} 的字典。
这通常效果很好,并且可以避免大量令人 NumPy 的重复。
我正在使用 django-notifications 在某些事件发生时发送电子邮件 - 假设您收到一条私有(private)消息。 Django 通知带有一个内置的排队功能,我现在正在集成该功能。
但是,问题是 django-notifications 在队列时腌制上下文字典。这就是 locals() 技巧失败的地方——来自 locals 的字典除了局部变量之外还有很多废话(例如它有 import 和 int())。本地人创建的字典不会被腌制。
我看到三个选项:1)重写 django-notifications 的排队方法以在存储模板之前渲染模板(简单但有点乏味并且破坏可升级性)2)停止使用本地技巧并开始重复自己3)尝试找到一个轻量级版本的 locals(或者一种腌制 locals 的方法)。
我在这里希望有人能引导我们朝着#3 的方向前进。
如果它可能相关,这是我尝试使用 locals() 快捷方式进行 pickle 时遇到的错误:
TypeError: can't pickle ellipsis objects
此外,locals()的字典输出:
{
'__builtins__':
{
'bytearray': <type 'bytearray'>,
'IndexError': <type 'exceptions.IndexError'>,
'all': <built-in function all>,
'help': Type help() for interactive help,
or help(object) for help about object.,
'vars': <built-in function vars>,
'SyntaxError': <type 'exceptions.SyntaxError'>,
'unicode': <type 'unicode'>,
'UnicodeDecodeError': <type 'exceptions.UnicodeDecodeError'>,
'isinstance': <built-in function isinstance>,
'copyright': Copyright (c) 2001-2010 Python Software Foundation.
All Rights Reserved.
Copyright (c) 2000 BeOpen.com.
All Rights Reserved.
Copyright (c) 1995-2001 Corporation for National Research Initiatives.
All Rights Reserved.
Copyright (c) 1991-1995 Stichting Mathematisch Centrum,
Amsterdam.
All Rights Reserved.,
'NameError': <type 'exceptions.NameError'>,
'BytesWarning': <type 'exceptions.BytesWarning'>,
'dict': <type 'dict'>,
'input': <built-in function input>,
'oct': <built-in function oct>,
'bin': <built-in function bin>,
'SystemExit': <type 'exceptions.SystemExit'>,
'StandardError': <type 'exceptions.StandardError'>,
'format': <built-in function format>,
'repr': <built-in function repr>,
'sorted': <built-in function sorted>,
'False': False,
'RuntimeWarning': <type 'exceptions.RuntimeWarning'>,
'list': <type 'list'>,
'iter': <built-in function iter>,
'reload': <built-in function reload>,
'Warning': <type 'exceptions.Warning'>,
'__package__': None,
'round': <built-in function round>,
'dir': <built-in function dir>,
'cmp': <built-in function cmp>,
'set': <type 'set'>,
'bytes': <type 'str'>,
'reduce': <built-in function reduce>,
'intern': <built-in function intern>,
'issubclass': <built-in function issubclass>,
'Ellipsis': Ellipsis,
'EOFError': <type 'exceptions.EOFError'>,
'locals': <built-in function locals>,
'BufferError': <type 'exceptions.BufferError'>,
'slice': <type 'slice'>,
'FloatingPointError': <type 'exceptions.FloatingPointError'>,
'sum': <built-in function sum>,
'getattr': <built-in function getattr>,
'abs': <built-in function abs>,
'exit': Use exit() or Ctrl-D (i.e. EOF) to exit,
'print': <built-in function print>,
'True': True,
'FutureWarning': <type 'exceptions.FutureWarning'>,
'ImportWarning': <type 'exceptions.ImportWarning'>,
'None': None,
'hash': <built-in function hash>,
'ReferenceError': <type 'exceptions.ReferenceError'>,
'len': <built-in function len>,
'credits': Thanks to CWI,
CNRI,
BeOpen.com,
Zope Corporation and a cast of thousands
for supporting Python development. See www.python.org for more information.,
'frozenset': <type 'frozenset'>,
'__name__': '__builtin__',
'ord': <built-in function ord>,
'super': <type 'super'>,
'_': None,
'TypeError': <type 'exceptions.TypeError'>,
'license': Type license() to see the full license text,
'KeyboardInterrupt': <type 'exceptions.KeyboardInterrupt'>,
'UserWarning': <type 'exceptions.UserWarning'>,
'filter': <built-in function filter>,
'range': <built-in function range>,
'staticmethod': <type 'staticmethod'>,
'SystemError': <type 'exceptions.SystemError'>,
'BaseException': <type 'exceptions.BaseException'>,
'pow': <built-in function pow>,
'RuntimeError': <type 'exceptions.RuntimeError'>,
'float': <type 'float'>,
'MemoryError': <type 'exceptions.MemoryError'>,
'StopIteration': <type 'exceptions.StopIteration'>,
'globals': <built-in function globals>,
'divmod': <built-in function divmod>,
'enumerate': <type 'enumerate'>,
'apply': <built-in function apply>,
'LookupError': <type 'exceptions.LookupError'>,
'open': <built-in function open>,
'quit': Use quit() or Ctrl-D (i.e. EOF) to exit,
'basestring': <type 'basestring'>,
'UnicodeError': <type 'exceptions.UnicodeError'>,
'zip': <built-in function zip>,
'hex': <built-in function hex>,
'long': <type 'long'>,
'next': <built-in function next>,
'ImportError': <type 'exceptions.ImportError'>,
'chr': <built-in function chr>,
'xrange': <type 'xrange'>,
'type': <type 'type'>,
'__doc__': "Built-in functions,
exceptions,
and other objects.\n\nNoteworthy: None is the `nil' object; Ellipsis represents `...' in slices.",
'Exception': <type 'exceptions.Exception'>,
'tuple': <type 'tuple'>,
'UnicodeTranslateError': <type 'exceptions.UnicodeTranslateError'>,
'reversed': <type 'reversed'>,
'UnicodeEncodeError': <type 'exceptions.UnicodeEncodeError'>,
'IOError': <type 'exceptions.IOError'>,
'hasattr': <built-in function hasattr>,
'delattr': <built-in function delattr>,
'setattr': <built-in function setattr>,
'raw_input': <built-in function raw_input>,
'SyntaxWarning': <type 'exceptions.SyntaxWarning'>,
'compile': <built-in function compile>,
'ArithmeticError': <type 'exceptions.ArithmeticError'>,
'str': <type 'str'>,
'property': <type 'property'>,
'GeneratorExit': <type 'exceptions.GeneratorExit'>,
'int': <type 'int'>,
'__import__': <built-in function __import__>,
'KeyError': <type 'exceptions.KeyError'>,
'coerce': <built-in function coerce>,
'PendingDeprecationWarning': <type 'exceptions.PendingDeprecationWarning'>,
'file': <type 'file'>,
'EnvironmentError': <type 'exceptions.EnvironmentError'>,
'unichr': <built-in function unichr>,
'id': <built-in function id>,
'OSError': <type 'exceptions.OSError'>,
'DeprecationWarning': <type 'exceptions.DeprecationWarning'>,
'min': <built-in function min>,
'UnicodeWarning': <type 'exceptions.UnicodeWarning'>,
'execfile': <built-in function execfile>,
'any': <built-in function any>,
'complex': <type 'complex'>,
'bool': <type 'bool'>,
'ValueError': <type 'exceptions.ValueError'>,
'NotImplemented': NotImplemented,
'map': <built-in function map>,
'buffer': <type 'buffer'>,
'max': <built-in function max>,
'object': <type 'object'>,
'TabError': <type 'exceptions.TabError'>,
'callable': <built-in function callable>,
'ZeroDivisionError': <type 'exceptions.ZeroDivisionError'>,
'eval': <built-in function eval>,
'__debug__': True,
'IndentationError': <type 'exceptions.IndentationError'>,
'AssertionError': <type 'exceptions.AssertionError'>,
'classmethod': <type 'classmethod'>,
'UnboundLocalError': <type 'exceptions.UnboundLocalError'>,
'NotImplementedError': <type 'exceptions.NotImplementedError'>,
'AttributeError': <type 'exceptions.AttributeError'>,
'OverflowError': <type 'exceptions.OverflowError'>
},
'notification': <module 'notification.models' from '/home/b/webapps/myapp/notification/models.pyc'>,
'u': <User: abcd>,
'User': <class 'django.contrib.auth.models.User'>
}
最佳答案
请允许我提出使用 locals()
的替代方案
class Object(object):
pass
def foo():
result = Object()
result.my_var = 'bar'
your_var = 'not to be returned'
result.var2 = 'baz' + result.my_var + len(your_var)
return result.__dict__
另一种选择是在创建对象时将其添加到上下文中。
def foo():
result = {}
result['my_var'] = my_var = 'bar'
your_var = 'not to be returned'
result['var2'] = var2 = 'baz' + my_var + len(your_var)
return result
尽管如此,请确保每次修改变量时(或至少最后一次)都会发生多重赋值。
编辑: 您应该使用第二个版本。我确信使用上下文字典(结果
或ctx
或其他)感觉不是很 DRY,但让我告诉你,这实际上是一件好事。 Python 的禅宗指出“显式优于隐式。”当您返回 locals()
的值时,谁知道您正在返回什么。全局命名空间中的所有内容、嵌套命名空间中的所有内容、您可能进行的每个中间计算,所有这些内容都会隐式返回给调用者。
如果您为希望返回的值创建一个容器,那么您就明确了您的意图,在两者之间划了一条清晰的界限
this_is_for_me = 'foo'
和
result['this_is_for_you'] = 'bar'
代码中的区别很明显,什么是公开的,供其他人使用;和私有(private)的,可能会发生变化,具体实现。调用者也很清楚,因为这些私有(private)值根本不可用。
如果您正在集成一个始终使用 locals()
魔法的外部库,您应该对在哪里以及如何使用它感到非常犹豫。与任何其他可用选项相比,我可能更愿意修补执行此操作的代码。
关于Python:pickling locals(),或者 locals 有一个更轻量级的表兄弟吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6834432/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!