2017-01-11 8 views
1

エクササイズについて約データ抽象化と不変データの場合、数値と関数のみを使用して日付構造を作成する必要があります。私はまた、日付のコンポーネントを印刷する関数を実装する必要があります。Pythonで日付構造を作成するには?

実行例:私は3番目の実行行を理解しない

>>>d = make_date(2016, 12, 26) 
>>>d 
<function make_date.<locals>.dispatch at 0x02A880C0> 
>>>year (d) 
2016 
>>>month (d) 
December 
>>> day (d) 
26 
>>> str_date(d) 
'26th of December, 2016' 

..

<function make_date.<locals>.dispatch at 0x02A880C0> 

は、私は、このような実行とコードの例を得ることができますか?私はこれを取得することがうまく管理..

<function dispatch at 0x02CCE078> 

ここ

は、私がこれまでに得たものである:

def make_date(y,m,d): 
    def year_f(): 
     nonlocal y 
     return y 
    def day_f(): 
     nonlocal d 
     return d  
    def month_f(): 
     nonlocal m 
     if(m==1): 
      return 'January' 
     if(m==2): 
      return 'February' 
     if(m==3): 
      return 'March' 
     if(m==4) . . . 

    def dispatch(date_type): 
     if date_type==1: 
      return year_f 
     if date_type==2: 
      return month_f 
     if date_type==3: 
      return day_f 
    return dispatch 
    #=================================================# 
def year(p): 
    return p(1)() 
def month(p): 
    return p(2)() 
def day(p): 
    return p(3)() 
def str_date(p): 
    return repr("{0}th of {1}, {2}".format(day(p),month(p),year(p))) 

答えて

2

make_dateは、あなたがdに割り当て、機能オブジェクトを返します。

<function make_date.<locals>.dispatch at 0x02A880C0> 

期待されている

あなたがdを印刷するとき、あなたは機能の表現を取得するには、生成された関数が呼び出されません。あなたがyear(d)を呼び出すとき

def year(p): 
    return p(1)() 

、それは(d(1)()を呼ぶん:d(<some params>)

ノートスニペットでの構文:

が結果を取得するには、単にこのような関数を呼び出すする必要があります 1をパラメータとして呼び出します)

EDIT:これは本当に質問に答えていませんでした。あなたが提供されたコードで、私は

dispatchmake_dateにネストされているので)

<function make_date.<locals>.dispatch at 0x000000000346A6A8> 

を取得しかし、それは(nonlocal文を削除)のPython 2でのPython 3.4(またはそれ以上)

を実行していますか、 Python 3.2(同じコード)では<function dispatch at 0x000000000341A510>が得られます。

必要な出力を得るには、Pythonのバージョンをアップグレードする必要があります。

+0

make_dateなしでが表示されます。 部分 –

+0

私の編集を参照してください。提供されたスニペットでそれは起こらない(私はPython 3を実行している) –

+0

しかし、私のコードディスパッチでは、make_dateにネストされていると私は<関数make_dateを取得しないでください。 .dispatch at 0x000000000346A6A8> –

関連する問題