簡體   English   中英

在嵌套函數中訪問頂級函數參數

[英]Accessing Top-level function parameters within a Nested Function

我的generate_report函數有2個參數。 generate_report函數中,我還有另一個名為generate_sub_report函數。 我想在generate_sub_report使用參數report_typedate_range

def generate_report(report_type, date_range):
  with open('file.csv') as f:
    # do some stuff
  def generate_sub_report():
    report_map = {'Budget': ['a', 'b', 'c'], 'Finance': ['d', 'e', 'f']}
    get_list_from_dict = report_map.get(report_type)
    if date_range == 'Summary':
       columns = ...

如何在generate_sub_report使用函數參數report_typedate_range 我想說的是,我如何才能讓generate_sub_report繼承參數generate_report

編輯/更新的問題

運行下面的代碼。

它拋出: UnboundLocalError: local variable 'date_range' referenced before assignment

如果我更改def get_keyword_report_request(report_type, date_range):考慮到也許我必須通過嵌套函數傳遞參數,則它會拋出:

TypeError: get_keyword_report_request() missing 2 required positional arguments: 'report_type' and 'date_range'

def generate_report(report_type, date_range):
  def get_keyword_report_request():
    columns_map = {
        "Account": ["AccountName", "AccountId", "Impressions", "Clicks", "Spend",
                    "Conversions"],
        "Campaign": ["AccountName", "AccountId", "CampaignName", "Status", "Impressions",
                     "Clicks", "Spend", "Conversions"],
        "Keyword": ["AccountName", "AccountId", "CampaignName", "CampaignStatus",
                    "AdGroupName", "AdGroupStatus", "Keyword", "KeywordStatus",
                    "BidMatchType", "CurrentMaxCpc", "Impressions", "Clicks", "Spend",
                    "AveragePosition", "Conversions"],
        "Ad group": ["AccountName", "AccountId", "CampaignName", "AdGroupName", "Status",
                     "Impressions", "Clicks", "Spend", "AveragePosition", "Conversions"],
        "Search Query": ["AccountName", "AccountId", "CampaignName", "CampaignStatus",
                         "AdGroupName", "SearchQuery", "Keyword", "BidMatchType",
                         "DeliveredMatchType", "Impressions", "Clicks", "Spend",
                         "AveragePosition", "Conversions"],
        "Ad": ["AccountName", "AccountId", "CampaignName", "AdGroupName", "Status",
               "AdTitle", "AdDescription", "DisplayUrl", "DestinationUrl", "AdStatus",
               "Impressions", "Clicks", "Spend", "AveragePosition", "Conversions"]
    }

    columns = columns_map.get(report_type)

    if isinstance(date_range, list):
      # do this
      print('wha')
    elif isinstance(date_range, str):
      date_range = date_range
      print(date_range)
    return(date_range, report_type)
  get_keyword_report_request()
generate_report('Keyword', 'Summary')

我最初的問題仍然存在:如何在較大函數的嵌套/內部函數中使用頂級函數的參數? 這可能是非常基礎的,我可能是個白痴,對此表示贊同。 我顯然不了解非常基本的內容。 很抱歉最初缺乏清晰性。

report_type已經可用於generate_subreport因為它是自動捕獲的。 這是證明:

>>> def generate_report(report_type):
...    def generate_subreport():
...       print "the report type is " + report_type
...    generate_subreport()
...
>>> generate_report('Big Report')
the report type is Big Report
>>> generate_report('Small Report')
the report type is Small Report
>>>

更新

恭喜,您遇到了一種已知的Python疣。 假定所有分配的變量都是局部變量

這有效:

>>> def generate_report(date_range):
...   def get_keyword_report_request():
...     print date_range
...   get_keyword_report_request()
...
>>> generate_report('Annually')
Annually

但這失敗了

>> def generate_report(date_range):
...   def get_keyword_report_request():
...     print date_range
...     date_range = 'Monthly' # one extra line
...   get_keyword_report_request()
...
>>> generate_report('Annually')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in generate_report
  File "<stdin>", line 3, in get_keyword_report_request
UnboundLocalError: local variable 'date_range' referenced before assignment

Python看到您要在內部函數中分配給date_range變量,並決定需要在內部函數中聲明一個新的date_range局部變量,並且當您調用print date_range ,它會拋出錯誤,因為內部date_range沒有尚未初始化。

您的解決方法-是刪除date_range = date_range分配。 它絕對不做任何事情。

def generate_report(report_type, date_range):
  def get_keyword_report_request(): 
    columns_map = {'Account': ['AccountName', 'AccountId', 'Impressions', 'Clicks', 'Spend', 'Conversions'],
             'Campaign': ['AccountName', 'AccountId', 'CampaignName', 'Status', 'Impressions', 'Clicks', 'Spend', 'Conversions'],
             'Ad group': ['AccountName', 'AccountId', 'CampaignName', 'AdGroupName', 'Status', 'Impressions', 'Clicks', 'Spend', 'AveragePosition', 'Conversions'], #Adgroup status?
             'Ad': ['AccountName', 'AccountId', 'CampaignName', 'AdGroupName', 'Status', 'AdTitle', 'AdDescription', 'DisplayUrl', 'DestinationUrl', 'AdStatus', 'Impressions', 'Clicks', 'Spend', 'AveragePosition', 'Conversions'],
             'Keyword': ['AccountName', 'AccountId', 'CampaignName', 'CampaignStatus', 'AdGroupName', 'AdGroupStatus', 'Keyword', 'KeywordStatus', 'BidMatchType', 'CurrentMaxCpc', 'Impressions', 'Clicks', 'Spend', 'AveragePosition', 'Conversions'],
             'Search Query': ['AccountName', 'AccountId', 'CampaignName', 'CampaignStatus', 'AdGroupName', 'SearchQuery', 'Keyword', 'BidMatchType', 'DeliveredMatchType', 'Impressions', 'Clicks', 'Spend', 'AveragePosition', 'Conversions']
             }

    columns = columns_map.get(report_type)

    if isinstance(date_range, list):
      # do this
      print('wha')
    elif isinstance(date_range, str):
      # Commented out: date_range = date_range
      print(date_range)
    return(date_range, report_type)
  get_keyword_report_request()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM