小编Nik*_*s R的帖子

可以访问Context的Jinja Extension

是否可以编写一个Jinja2扩展,在渲染时可以访问模板上下文?我想编写一个访问上下文变量的扩展,并根据该变量输出一些数据.我找不到有关如何编写此类扩展的足够信息.

现在,我有这个:

class CsrfExtension(jinja2.ext.Extension):
    r""" Adds a {% csrf %} tag to Jinja. """

    tags = set(['csrf'])
    template = '<input type="hidden" name="csrfmiddlewaretoken" value="%s">'

    def parse(self, parser):
        token = next(parser.stream)
        lineno = token.lineno
        return self.call_method('_render_csrf', lineno=lineno)

    def _render_csrf(self, value, name, *args, **kwargs):
        csrf_token = somehow_get_variable('csrf_token')
        return jinja2.Markup(self.template % csrf_token)
Run Code Online (Sandbox Code Playgroud)

但在 foo.jinja

<!DOCTYPE html>
<html>
    <body>
        <h1>This is a Test</h1>
        {% csrf %}
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

我明白了

SyntaxError at /
invalid syntax (foo.jinja, line 7)
Run Code Online (Sandbox Code Playgroud)

我以为我会得到一个NameError,因为somehow_get_variable()没有定义.我需要知道a)如何从当前上下文中获取变量,以及b)如何正确编写扩展.

还有,为什么7号线?该{% csrf %}标签是第5行甚至当我修剪 …

python jinja2

6
推荐指数
1
解决办法
1231
查看次数

我应该在大量使用的函数上使用`inline`吗?

我有一个cnVector代表三维空间中一个点的类.它的运算符+ - */被密集使用.
他们的实施很短:

cnVector cnVector::operator + (const cnVector& v) const {
    return cnVector(
        x + v.x,
        y + v.y,
        z + v.z );
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,因为这个功能很短,我应该内联它虽然它的密集使用?或者将使用它时,它产生太多的代码多少?

c++ inline

5
推荐指数
2
解决办法
178
查看次数

有没有办法包装一个像关键字一样命名的结构(例如 print )?

我有一些C源代码,想将其包装在 Cython 中。现在的问题是,有一个名为 的结构print,并且 externing 它会引发语法错误。

cdef extern from "foo.h":
    struct print:
        # ...
Run Code Online (Sandbox Code Playgroud)

当像关键字一样调用属性或函数等时,也会出现同样的问题。

cdef extern from "foo.h":
    struct foo:
        bint print
    print(char*, int)
Run Code Online (Sandbox Code Playgroud)

有没有办法在不修改源代码的情况下解决这个问题?也许有某种技术可以用源文件中的真实姓名替换代理名称?

keyword cython word-wrap

5
推荐指数
1
解决办法
473
查看次数

常数和糖

我有一组经常使用的函数,所以我想在库中收集它们.在我开始编写库之前,我在考虑在哪里存储影响某些函数行为的常量.

使用该库时我想写的内容如下:

import tools
tools.collect(object_a, object_b, mode=tools.collect.RECURSIVE)
Run Code Online (Sandbox Code Playgroud)

一般来说,函数应该能够接受的常量应该存储在函数本身中.

为了实现这一点,我创建了一个装饰器函数,将传递的属性分配给修饰函数.

def attr_decorator(**attrs):
    def decorator(f):
        for k, v in attrs.iteritems():
            setattr(f, k, v)
        return f
    return decorator
Run Code Online (Sandbox Code Playgroud)

这个装饰器可以像这样使用:

@attr_decorator(
    FLAT = 1 << 0,
    RECURSIVE 1 << 1,
)
def collect(a, b, mode):
    # ...
Run Code Online (Sandbox Code Playgroud)

到目前为止这个工作非常好.

但是默认参数呢?

@attr_decorator(
    FLAT = 1 << 0,
    RECURSIVE 1 << 1,
)
def collect(a, b, mode=collect.RECURSIVE):
    # ...
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为在存储mode参数的default-value时未定义collect函数(因此甚至没有修饰).

这看起来不太好看

我能够提出的唯一解决方案导致了一种笨拙的语法,它看起来并不好看.我给装饰器函数提供了与要装饰的函数相同的属性.

def attr_decorator(**attrs):
    def decorator(f):
        for k, v in attrs.iteritems():
            setattr(f, k, …
Run Code Online (Sandbox Code Playgroud)

python constants decorator syntactic-sugar

5
推荐指数
1
解决办法
104
查看次数

C++未初始化的类实例数组

我一直在寻找,但无法找到答案.有没有办法告诉new操作员不要调用类构造函数?

MyObject* array = new MyObject[1000];
Run Code Online (Sandbox Code Playgroud)

这将召唤MyObject()一千次!我想自己填充分配的内存,不需要在构造函数中初始化任何信息.使用malloc()不是非常和谐的C++代码imho.

MyObject* array = (MyObject*) malloc(sizeof(MyObject) * 1000);
Run Code Online (Sandbox Code Playgroud)

c++ initialization new-operator alloc

5
推荐指数
1
解决办法
2222
查看次数

except-clause删除局部变量

exc = None
try:
    raise Exception
except Exception as exc:
    pass

# ...

print(exc)
Run Code Online (Sandbox Code Playgroud)

NameError:未定义名称'exc'

这曾经在Python2中工作.为什么这样改变了?如果我至少可以重新分配exc,类似于类级属性

class Foo(object):
    Bar = Bar
Run Code Online (Sandbox Code Playgroud)

但这也不能使它工作:

exc = None
try:
    raise Exception
except Exception as exc:
    exc = exc
Run Code Online (Sandbox Code Playgroud)

有什么好的提示可以实现同样的目标吗?我不想写这样的东西:

exc = None
try:
    raise Exception("foo")
except Exception as e:
    exc = e

# ...

print(exc)
Run Code Online (Sandbox Code Playgroud)

python scope python-3.x try-except

5
推荐指数
1
解决办法
200
查看次数

DAG的并行处理

我正在努力弄清楚如何并行处理有向无环图。每个节点应该只有在其所有输入节点都被预先处理后才能“执行”。想象一个Task具有以下接口的类 :

class Task(object):
    result = None
    def inputs(self):
        ''' List all requirements of the task. '''
        return ()
    def run(self):
        pass
Run Code Online (Sandbox Code Playgroud)

除了一种方法之外,我想不出一种方法来处理可由该结构同时与最大数量的工作人员异步表示的图形。

认为通过为每个任务创建一个线程,等待所有输入被处理来实现最佳处理。但是,立即而不是连续(即当任务准备好处理时)为每个任务生成一个线程对我来说听起来不是一个好主意。

import threading
class Runner(threading.Thread):
    def __init__(self, task):
        super(Runner, self).__init__()
        self.task = task
        self.start()
    def run(self):
        threads = [Runner(r) for r in self.task.inputs()]
        [t.join() for t in threads]
        self.task.run()
Run Code Online (Sandbox Code Playgroud)

有没有办法更理想地模仿这种行为?此外,这种方法目前没有实现限制一次运行任务数量的方法。

python multithreading directed-acyclic-graphs python-2.7

5
推荐指数
1
解决办法
1834
查看次数

zipimporter无法找到/加载子模块

我正在尝试从ZIP包中加载子模块,但它不起作用.怎么做对了?

foo.zip

foo/
    __init__.py
   bar.py
Run Code Online (Sandbox Code Playgroud)

test.py

import os
import zipimport

dirname = os.path.dirname(__file__)
importer = zipimport.zipimporter(os.path.join(dirname, 'foo.zip'))
print importer.is_package('foo')
print importer.load_module('foo')
print importer.load_module('foo.bar')
Run Code Online (Sandbox Code Playgroud)

产量

$ python test.py
True
<module 'foo' from 'foo.zip/foo/__init__.py'>
Traceback (most recent call last):
  File "test.py", line 8, in <module>
    print importer.load_module('foo.bar')
zipimport.ZipImportError: can't find module 'foo.bar'
Run Code Online (Sandbox Code Playgroud)

更新 2015/04/11 06:30 AM

以下是可行的,但这是问题的真正解决方案吗?该zipimport.zipimporter文档明确声明"fullname必须是完全限定(虚线)模块名称." 并有一个is_package()似乎正常运行的方法.

import os
import zipimport

dirname = os.path.dirname(__file__)
importer = zipimport.zipimporter(os.path.join(dirname, 'foo.zip'))

def load_module(name):
    parts = name.split('.')
    module = importer.load_module(parts[0]) …
Run Code Online (Sandbox Code Playgroud)

python import python-2.7

5
推荐指数
1
解决办法
1444
查看次数

pip 和 setuptools 之间的 data_files 差异

我有一个带有setup.py脚本的 Python 应用程序,可以通过 Pip 或 setuptools 安装。但是,我发现这两种方法之间存在一些烦人的差异,我想知道分发数据文件的正确方法

import glob
import setuptools

long_description = ''
setuptools.setup(
  name='creator-build',
  version='0.0.3-dev',
  description='Meta Build System for Ninja',
  long_description=long_description,
  author='Niklas Rosenstein',
  author_email='rosensteinniklas@gmail.com',
  url='https://github.com/creator-build/creator',
  py_modules=['creator'],
  packages=setuptools.find_packages('.'),
  package_dir={'': '.'},
  data_files=[
    ('creator', glob.glob('creator/builtins/*.crunit')),
  ],
  scripts=['scripts/creator'],
  classifiers=[
    "Development Status :: 5 - Production/Stable",
    "Programming Language :: Python",
    "Intended Audience :: Developers",
    "Topic :: Utilities",
    "Topic :: Software Development :: Libraries",
    "Topic :: Software Development :: Libraries :: Python Modules",
    ],
  license="MIT",
)
Run Code Online (Sandbox Code Playgroud)
  1. 使用Pip,指定的文件data_files …

installation pip data-files setuptools python-3.x

5
推荐指数
1
解决办法
216
查看次数

类型提示的正确类型提示是什么?

我有一个接受类型提示作为函数参数的用例。但是接受类型提示的正确类型提示是什么?

T = TypeVar('T', bound='TypeHintType')

def register_handler(type_hint: T, handler: Handler[T]) -> None:
    ...
Run Code Online (Sandbox Code Playgroud)

是否有一个“TypeHintType”可以用来注释类型提示作为参数?

python type-annotation

5
推荐指数
0
解决办法
483
查看次数