考虑带有签名的功能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支持会很不错,但不是严格要求的。
我试图找出istream使用x3 解析的正确方法。较旧的文档指的是multi_pass东西,我仍然可以使用它吗?还是有其他方法来缓冲X3的流,以便它可以回溯?
我是C++和Boost Spirit X3的新手.对于我的项目,我将两个文件中的地理社交图解析为具有以下结构,其中boost boost X3为boost图.
我有一个有效的实施.由于我之前没有任何图书馆的经验,我想知道你对这种方法的看法,以及你是否建议采取不同的方法.
在图形文件中,每条边有一条线.解析边缘时,我必须创建图形的节点,以防以前没有看到节点.我使用语义操作,每次遇到node-id时都会检查该节点是否已经在图中.阅读完一行后,我使用语义动作然后添加边缘.
在位置文件中,在给定时间每个节点的已知位置有一行.我存储了图中节点已知的第一个位置(使用自定义boost图属性).
我必须提出具体问题,但很乐意接受任何想法和建议:
图表(表示图中的边)
[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)