python - 在另一个函数中调用 2 个函数
问题描述
我试图在一个函数中调用 extract 函数和 extract_url 函数。我知道name error: name 'endpoint' and name 'agg_key' is not defined.
我正在这样做,所以我可以从另一个脚本调用一个脚本,所以我不需要运行命令行。我该怎么做呢?
我试图调用的函数:
def scrape_all_products(URL):
extract(endpoint, agg_key, page_range=None)
extract_url(args)
我正在调用的函数:
def extract(endpoint, agg_key, page_range=None):
r_list = list(range(page_range[0], page_range[1]+1)) if page_range else []
page = 1
agg_data = []
while True:
page_endpoint = endpoint + f'?page={str(page)}'
response = requests.get(page_endpoint, timeout=(
int(os.environ.get('REQUEST_TIMEOUT', 0)) or 10))
response.raise_for_status()
if response.url != page_endpoint: # to handle potential redirects
p_endpoint = urlparse(response.url) # parsed URL
endpoint = p_endpoint.scheme + '://' + p_endpoint.netloc + p_endpoint.path
if not response.headers['Content-Type'] == 'application/json; charset=utf-8':
raise Exception('Incorrect response content type')
data = response.json()
page_has_products = agg_key in data and len(
data[agg_key]) > 0
page_in_range = page in r_list or page_range is None
# break loop if empty or want first page
if not page_has_products or not page_in_range:
break
agg_data += data[agg_key]
page += 1
return agg_data
其他功能:
def extract_url(args):
p = format_url(args.url, scheme='https', return_type='parse_result')
formatted_url = p.geturl()
agg_key = 'products'
if args.collections:
agg_key = 'collections'
fp = os.path.join(
args.dest_path, f'{p.netloc}.{agg_key}.{args.output_type}')
if args.file_path:
fp = os.path.join(
args.dest_path, f'{args.file_path}.{args.output_type}')
endpoint = f'{formatted_url}/{agg_key}.json'
ret = {
'endpoint_attempted': endpoint,
'collected_at': str(datetime.now()),
'success': False,
'error': ''
}
try:
data = extract(endpoint, agg_key, args.page_range)
except requests.exceptions.HTTPError as err:
ret['error'] = str(err)
except json.decoder.JSONDecodeError as err:
ret['error'] = str(err)
except Exception as err:
ret['error'] = str(err)
else:
ret['success'] = True
ret[agg_key] = data
if ret['success']:
ret['file_path'] = str(fp)
save_to_file(fp, data, args.output_type)
return ret
解决方案
该scrape_all_products
函数只知道在该函数内部创建的变量和传递给它的变量(在这种情况下是URL
)。endpoint
并且agg_key
都是在不同的函数内部创建的。您必须以与传递scrape_all_products
相同的方式传递这些变量URL
。这样做:
def scrape_all_products(URL, endpoint, agg_key, args):
然后你必须适当地修改任何scrape_all_products
被调用的地方。
推荐阅读
- spark-ar-studio - 如何使用滑块ui更改矩形的不透明度
- reactjs - 如何访问在 App.js 中呈现的组件中的变量
- swift - 结合对服务器的访问在 Playground 内而不是在函数内检索数据。为什么?
- python - For in 语句只打印最后的结果
- angular - 如何以角度创建动态菜单
- android - 观察 Android Jetpack DataStore 值变化
- php - cookie 上的 SameSite=None 和 Secure=1 标志是 CSRF 方面的安全威胁吗?
- verilog - 如何在 SystemVerilog 中定义共享同一数据总线的多个模块
- performance - 有哪些应用程序用例可以在应用程序级别指标上扩展?
- mysql - 使用 Laravel 在 MySql 中插入/更新/删除和获取 JSON