【问题标题】:Parameter list with variable types Python 3?具有变量类型 Python 3 的参数列表?
【发布时间】:2015-01-13 03:59:40
【问题描述】:

我想知道是否可以有一个参数列表,其中包含可以传递给函数的字符串中的关键字?基本上,参数列表可能有也可能没有关键字,因此参数列表将具有变量“类型”。这是我正在尝试做的一个示例:

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.

【问题讨论】:

    标签: python python-3.x parameter-passing


    【解决方案1】:

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

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

    使用

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

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

    【讨论】:

      【解决方案2】:

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

      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)
      

      【讨论】:

        【解决方案3】:

        您可以创建一个字符串表示如何传递所有参数,并使用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)
        

        【讨论】:

          猜你喜欢
          • 2018-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多