一个函数,该函数创建以传入的参数命名的函数

犬儒

有没有一种方法可以使传入的变量在以后命名的其他函数中被调用呢?

对于这个例子,让我们假装https://example.com/engine_list返回该XML文件,当我把它在get_search_engine_xml

<engines>
    <engine address="https://www.google.com/">Google</engine>
    <engine address="https://www.bing.com/">Bing</engine>
    <engine address="https://duckduckgo.com/">DuckDuckGo</engine>
</engines>

这是我的代码:

import re
import requests
import xml.etree.ElementTree as ET
base_url = 'https://example.com'

def make_safe(s):
    s = re.sub(r"[^\w\s]", '', s)
    s = re.sub(r"\s+", '_', s)
    s = str(s)
    return s

# This is what I'm trying to figure out how to do correctly, create a function
# named after the engine returned in get_search_engine_xml(), to be called later
def create_get_engine_function(function_name, address):
    def function_name():
        r = requests.get(address)
    return function_name

def get_search_engine_xml():
    url = base_url + '/engine_list'
    r = requests.get(url)
    engines_list = str(r.content)
    engines_root = ET.fromstring(engines_list)
    for child in engines_root:
        engine_name = child.text.lower()
        engine_name = make_safe(engine_name)
        engine_address = child.attrib['address']
        create_get_engine_function(engine_name, engine_address)

## Runs without error.
get_search_engine_xml()

## But if I try to call one of the functions.
google()

我收到以下错误。

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'google' is not defined

当我注销时,定义engine_name和engine_address似乎可以正常工作。因此,我非常确定问题出在create_get_engine_function上,该函数当然不知道我在做什么,并且我试图将类似的问题拼凑在一起。

您可以使用传入的参数来命名另一个函数创建的函数吗?有一个更好的方法吗?

懒狗

您可以将它们分配给globals()

def create_get_engine_function(function_name, address):
    def function():
        r = requests.get(address)

    function.__name__ = function_name
    function.__qualname__ = function_name  # for Python 3.3+ 
    globals()[function_name] = function

尽管,根据您实际要完成的工作,一个更好的设计是将所有引擎名称/地址存储在字典中,并根据需要访问它们:

# You should probably should rename this to 'parse_engines_from_xml'
def get_search_engine_xml(): 
    ...
    search_engines = {} # maps names to addresses
    for child in engines_root:
        ...
        search_engines[engine_name] = engine_address
    return search_engines

engines = get_search_engine_xml()

e = requests.get(engines['google'])
<do whatever>
e = requests.get(engines['bing'])
<do whatever>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我必须创建一个函数,该函数返回传入的数组的最后一个元素

打字稿:给定一个函数表,创建一个函数,该函数接受表的键和表中函数的第二个参数

根据现有函数中的一个免费参数创建一个可调用函数,该函数在python中具有许多参数

如何制作一个以函数作为参数并返回该函数的修改版本的函数?

编写一个函数,该函数将指向任何函数的指针作为参数

Javascript 函数,它接受一个函数或任何要由该函数求值的参数

OCaml函数少传入一个参数

创建一个模板函数,该函数根据模板参数类型的条件返回不同的元组类型

如何在c ++中创建一个函数,该函数具有由参数确定的矩阵大小?

一个函数,该函数创建可以被查询次数的函数

我可以创建一个函数,该函数是对象中函数的属性吗?

创建一个 get 函数,该函数在使用 getchar 函数按下时返回 char*

如何创建一个带有多个参数的函数并为该函数提供第一个参数的宏?

如何创建一个名为 isNumber 的函数,该函数接收名为 val 的参数并返回一个布尔值,指示参数是否为 number 类型

定义一个名为food的函数,该函数接收两个参数

定义一个 TypeScript 函数,该函数将接受一个可以有多个签名的函数的参数?

如何创建一个对象创建函数,该函数将由与其关联的名称调用?

编写一个valueStock函数,该函数将一组产品作为参数

使用泛型创建一个函数,该函数将在Swift中返回另一个函数

创建一个函数,该函数接受两个名为键和值的列表作为参数并返回一个数据帧

我如何制作一个模板化函数,该函数采用的参数是boost :: bind的结果?

Javascript:修改一个函数,该函数输出可变数量的参数以递归?

检查是否可以使用另一个函数的参数调用该函数

如何注册一个简单的回调函数并将参数传递给该函数?

您如何在Java中创建一个通用的占位符函数,该函数将函数作为参数供以后使用?

创建一个C ++模板函数,该函数将返回特定大小的std :: array

如何创建一个对象,该对象的对象在构造函数中可以执行该函数?

如何在Swift中创建一个函数,该函数返回符合协议的Type?

在SQL Server中创建一个函数,该函数返回许多用于排序的值