小编sci*_*tor的帖子

显示所有jinja对象属性

有没有办法在jinja模板中显示给定对象的所有属性的名称/内容/功能.这样可以更轻松地调试未按预期运行的模板.

我正在使用hyde框架构建一个网站,这将非常方便,因为我仍然在学习jinja和hyde的复杂性.

最初,我曾认为使用attr过滤器会起作用,但这似乎需要一个名称值.我想不必指定名称以获取对象的所有可用属性.

一些谷歌搜索显示django语法如下所示,但我不熟悉django所以这可能只适用于数据库项目.长话短说,我想要一个类似于任何名为的对象的方法obj

{% for field, value in obj.get_fields %}
    {{ field }} : {{ value }} </br>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

最终解决方案

@jayven是对的,我可以创建自己的jinja2过滤器.不幸的是,使用hyde的稳定版本(0.8.4),这不是一个简单的行为,在python路径中有一个过滤器,并在site.yaml文件中设置一个简单的yaml值(有一个拉请求).话虽这么说,我能够搞清楚!所以以下是我的最终解决方案,最终对调试任何未知属性非常有帮助.

只需创建一个包含以下目录树的本地python包,就可以轻松创建特定于站点的hyde扩展

hyde_ext
    __init__.py
    custom_filters.py
Run Code Online (Sandbox Code Playgroud)

现在创建扩展:

from hyde.plugin import Plugin
from jinja2 import environmentfilter, Environment


debug_attr_fmt = '''name:  %s
type:  %r
value: %r'''

@environmentfilter
def debug_attr(env, value, verbose=False):
    '''
    A jinja2 filter that creates a <pre> block
    that lists all the attributes of a given object
    inlcuding the value of …
Run Code Online (Sandbox Code Playgroud)

python jinja2 hyde

17
推荐指数
1
解决办法
1万
查看次数

在所有节点完成加载后,有没有办法使用PyYAML construct_mapping构造对象?

我试图在python中创建一个yaml序列,创建一个自定义的python对象.该对象需要使用之后解构的dicts和列表构建__init__.但是,似乎construct_mapping函数不构造嵌入序列(列表)和dicts的整个树.
考虑以下:

import yaml

class Foo(object):
    def __init__(self, s, l=None, d=None):
        self.s = s
        self.l = l
        self.d = d

def foo_constructor(loader, node):
    values = loader.construct_mapping(node)
    s = values["s"]
    d = values["d"]
    l = values["l"]
    return Foo(s, d, l)
yaml.add_constructor(u'!Foo', foo_constructor)

f = yaml.load('''
--- !Foo
s: 1
l: [1, 2]
d: {try: this}''')

print(f)
# prints: 'Foo(1, {'try': 'this'}, [1, 2])'
Run Code Online (Sandbox Code Playgroud)

这工作得很好,因为f持有的引用ld对象,这实际上是充满了数据之后Foo对象被创建.

现在,让我们做一些更复杂的smidgen:

class Foo(object):
    def __init__(self, …
Run Code Online (Sandbox Code Playgroud)

python yaml pyyaml

16
推荐指数
2
解决办法
1万
查看次数

Python相对导入导致SyntaxError异常

根据python文档,自python 2.5开始支持相对导入和内部包引用。我当前正在运行Python 2.7.3。因此,我尝试在自己的程序包中实现此功能,以便将其用于更简单的导入。我很惊讶地发现它引发了SyntaxError异常,我希望有人可以帮助您找到原因。

我设置了一个测试目录进行测试:

tester
??? __init__.py
??? first_level.py
??? sub
    ??? __init__.py
    ??? second_level.py
Run Code Online (Sandbox Code Playgroud)

两个__init__.py模块都为空。其他模块是:


# first_level.py
print "This is the first level of the package"
Run Code Online (Sandbox Code Playgroud)
# sub/second_level.py
import ..first_level
print "This is the second level"
Run Code Online (Sandbox Code Playgroud)

当我尝试导入second_level模块时,出现以下错误:

Python 2.7.3 (default, Aug  1 2012, 14:42:42) 
[GCC 4.2.1 Compatible Apple Clang 4.0 ((tags/Apple/clang-421.0.57))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Welcome!
>>> import tester
>>> import tester.sub.second_level
Traceback (most recent call last):
  File "<stdin>", line …
Run Code Online (Sandbox Code Playgroud)

python import syntax-error

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

Cython 预编译器决策

我正在寻找一种在 cython 文件中添加预编译器逻辑的解决方案。

我已经为 C++ 中的硬件设备 API 编写了一个 cython 包装器。这是一个 cython 项目,通常使用 MSVC for python 2.7 和 3.6 进行编译。整个包是用 cython 编写的,不需要外部 C++ 或头文件。

最初,我编写这个软件是为了在 Windows 计算机上使用,因此我使用了许多基本 winapi 函数来帮助访问内核事件循环和 winapi 错误消息。它工作得很好,但我还想添加跨平台编译的功能。这需要我完全替换几个关键功能才能使其在linux机器上运行。例如,硬件 API 甚至根据操作系统的不同而具有不同的事件处理函数。此外,winapi 事件处理也需要更换。

现在,我将整个项目编译成一个模块以简化导入。所有代码都驻留在编译成hwmodule.pyd文件的同一个 pyx 文件中。但是,为了实现跨平台编译的目标,我需要在安装时将几个小 pyx 文件修补到一起。这种解决方案并不优雅并且难以维护。更不用说,培训其他可能想要添加到项目中的人会更加困难。

理想情况下,我能够将 cython 写入 c 编译时标志,这些标志根据标志或变量进行解释和编译。cython 有什么解决方案可以实现我的目标吗?或者,是否有一个不同的组织可以优雅且易于维护?

一些看似合理的语法示例(可能存在也可能不存在)类似于 c 或 python 中的语法:

pre-compilation cython

2
推荐指数
1
解决办法
1958
查看次数

标签 统计

python ×3

cython ×1

hyde ×1

import ×1

jinja2 ×1

pre-compilation ×1

pyyaml ×1

syntax-error ×1

yaml ×1