小编lee*_*ezu的帖子

检查参数是通过位置传递还是通过关键字传递

考虑带有签名的功能f(a, b)。将来,我想将签名更改为f(a, *, b),不允许b作为位置参数传递。为了减少更改的影响,我想首先弃用指定的b位置,警告用户这样做。

为此,我想写一些类似的东西:

def f(a, b):
    frame = inspect.currentframe()
    if b in frame.specified_as_positional:
        print('Do not do that')
    else:
        print('Good')
Run Code Online (Sandbox Code Playgroud)

结果将是

>>> f(1, 2)
'Do not do that'
>>> f(1, b=2)
'Good'
Run Code Online (Sandbox Code Playgroud)

inspect.getargvalues(frame)似乎还不够。ArgInfo对象仅提供

>>> f(1,b=2)
ArgInfo(args=['a', 'b'], varargs=None, keywords=None, locals={'a': 1, 'b': 2})
Run Code Online (Sandbox Code Playgroud)

这样的检查在Python中甚至可能吗?从概念上讲,似乎不需要记住解释器是在位置指定还是作为关键字指定参数。

Python 2支持会很不错,但不是严格要求的。

python python-3.x

14
推荐指数
1
解决办法
314
查看次数

如何在Boost Spirit X3中进行“流式”解析?

我试图找出istream使用x3 解析的正确方法。较旧的文档指的是multi_pass东西,我仍然可以使用它吗?还是有其他方法来缓冲X3的流,以便它可以回溯?

c++ boost boost-spirit boost-spirit-x3

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

使用boost spirit X3高效地解析普通文件

我是C++和Boost Spirit X3的新手.对于我的项目,我将两个文件中的地理社交图解析为具有以下结构,其中boost boost X3为boost图.

我有一个有效的实施.由于我之前没有任何图书馆的经验,我想知道你对这种方法的看法,以及你是否建议采取不同的方法.

在图形文件中,每条边有一条线.解析边缘时,我必须创建图形的节点,以防以前没有看到节点.我使用语义操作,每次遇到node-id时都会检查该节点是否已经在图中.阅读完一行后,我使用语义动作然后添加边缘.

在位置文件中,在给定时间每个节点的已知位置有一行.我存储了图中节点已知的第一个位置(使用自定义boost图属性).

我必须提出具体问题,但很乐意接受任何想法和建议:

  • 是否可以像使用图形文件一样使用嵌套语义操作?这会伤害性能吗?
  • 是否建议使用Spirit X3一次解析整个文件,还是应该使用Spirit X3单独解析每一行?

图表(表示图中的边)

[user1]     [user2]
0           3
Run Code Online (Sandbox Code Playgroud)

地点

[user]  [check-in time]         [latitude]      [longitude]     [location id]
0       2010-10-19T23:55:27Z    30.2359091167   -97.7951395833      22847
Run Code Online (Sandbox Code Playgroud)

Spirit X3解析代码

// Parse the gowalla edge file
boost::spirit::istream_iterator file_iterator(edge_file), eof;

x3::phrase_parse(file_iterator, eof,
        // Begin grammar
        (
         *((x3::int_[add_vertex] >> x3::int_[add_vertex])[add_edge])
        ),
        // End grammar
        x3::space
        );

// Fail if we couldn't parse the whole edges file
if (file_iterator != eof) {
    std::cerr << "Couldn't parse whole edges file" << …
Run Code Online (Sandbox Code Playgroud)

c++ boost-spirit boost-graph boost-spirit-x3

3
推荐指数
1
解决办法
899
查看次数