def load_aten_declarations(path):
with open(path, 'r') as f:
declarations = yaml.load(f, Loader=Loader)
# enrich declarations with additional information
for declaration in declarations:
for arg in declaration['arguments']:
simple_type = arg['type']
simple_type = simple_type.replace(' &', '').replace('const ', '')
simple_type = simple_type.replace('Generator *', 'Generator')
arg['simple_type'] = simple_type
declaration['formals'] = [arg['type'] + ' ' + arg['name']
for arg in declaration['arguments']]
declaration['args'] = [arg['name'] for arg in declaration['arguments']]
declaration['api_name'] = declaration['name']
declaration['return_type'] = format_return_type(declaration['returns'])
declaration['base_name'] = declaration['name']
# Compute the Python function prototype for argument parsing
typed_args = []
positional = True
for arg in declaration['arguments']:
if arg.get('kwarg_only', False) and positional:
typed_args.append('*')
positional = False
typename = arg['simple_type']
if arg.get('is_nullable'):
typename = '{}?'.format(typename)
if arg.get('size') is not None:
typename = '{}[{}]'.format(typename, arg['size'])
param = typename + ' ' + arg['name']
default = None
if arg.get('default') is not None:
default = arg['default']
if default == 'nullptr' or default == '{}':
default = 'None'
if arg.get('python_default_init') is not None:
default = 'None'
if default is not None:
param += '=' + str(default)
typed_args.append(param)
# Python function prototype.
# This is the string that we give to FunctionParameter, which is
# then parsed into the actual structure which we do parsing
# with.
declaration['typed_args'] = typed_args
declaration['prototype'] = FUNCTION_PROTOTYPE.substitute(declaration)
return declarations
评论列表
文章目录