具有变量类型的参数列表 Python 3?

Parameter list with variable types Python 3?

我想知道我是否可以有一个参数列表,其中包含在字符串中给出的关键字,我可以将其传递给函数?基本上,参数列表可能有也可能没有关键字,所以参数列表会有变量'types'。这是我正在尝试做的一个例子:

from bs4 import BeautifulSoup
import urllib.request as urlreq
import my_parameters    # can have variable values

# my_parameters.useful_token_concept = ["h1", "class_ = some_class"]
# I want to pass these above parameters into a function; "class_" is
# a keyword, but it's wrapped in a string => gives me problems

url = my_parameters.url
page = urlreq.urlope(url)
pageHtml = page.read()
page.close()

soup = BeautifulSoup(pageHtml)
# something like the following line works:
# params = soup.find("h1", class_ = "some_class")
params = soup.find(*my_parameters.useful_token_concept)
# params = soup.find(my_parameters.useful_token_concept[0],\
         # my_parameters.useful_token_concept[1])

# I don't know how long the list of attributes/parameter-list to
# BeautifulSoup's find() function will be, nor do I know what keywords,
# if any, will be passed into find(), as given by a user to my_parameters.

print(params) # should print the html the user wants to scrape.

您需要将标记列表拆分为关键字参数字典和位置参数列表。

kwargs = {}
args = []
for i in my_parameters.useful_token_concept:
    bits = i.split('=')
    if len(bits) > 1:
       kwargs[bits[0].strip()] = bits[1].strip()
    else:
       args.append(bits[0].strip())

params = soup.find(*args, **kwargs)

为什么不使用更好的表示法呢?即,而不是

my_parameters.useful_token_concept = ["h1", "class_ = some_class"]

使用

my_parameters.useful_token_concept = ["h1", {"class_": "some_class"}]

由于这些值的表示形式由您决定,因此使用 dict 表示关键字参数比将它们编码为字符串然后再解析该字符串要简单得多!

您可以创建一个字符串表示形式来表示所有参数的传递方式,并使用 eval() 将它们变成您可以在实际函数调用中实际使用的内容:

my_parameters.useful_token_concept = ["h1", "class_ = some_class"]

def func_proxy(*args, **kwargs):
    " Just return all positional and keyword arguments. "
    return args, kwargs

calling_seq = ', '.join(my_parameters.useful_token_concept)
args, kwargs = eval('func_proxy({})'.format(calling_seq))
print('args:', args)     # -> args: (<Header1 object>,)
print('kwargs:', kwargs) # -> kwargs: {'class_': <class '__main__.some_class'>}

parms = soup.find(*args, **kwargs)