該賞金到期in 4天。這個問題的答案有資格獲得 50聲望獎勵。 佩佩想引起更多人對這個問題的關注。
我正在嘗試從pandas.tseries.holiday.USFederalHolidayCalendar.
這似乎是可能的,作為一次性操作,
from pandas.tseries.holiday import USFederalHolidayCalendar
cal = USFederalHolidayCalendar()
cal = cal.rules.pop(6)
但是,如果此代碼位于重復呼叫(在回圈中)以生成多個獨立輸出的函式中,則會出現以下錯誤:
IndexError: pop index out of range
它給我的印象是物件保持在其初始加載狀態,隨著回圈的進行,它會在索引 6 處彈出假期,直到它們消失,然后拋出錯誤。
我嘗試通過重新加載importlib.reload無濟于事。
知道我做錯了什么嗎?
uj5u.com熱心網友回復:
這里的問題是這rules是一個類屬性(物件串列)。請參閱從此處獲取的代碼:
class USFederalHolidayCalendar(AbstractHolidayCalendar):
"""
US Federal Government Holiday Calendar based on rules specified by:
https://www.opm.gov/policy-data-oversight/
snow-dismissal-procedures/federal-holidays/
"""
rules = [
Holiday("New Years Day", month=1, day=1, observance=nearest_workday),
USMartinLutherKingJr,
USPresidentsDay,
USMemorialDay,
Holiday("July 4th", month=7, day=4, observance=nearest_workday),
USLaborDay,
USColumbusDay,
Holiday("Veterans Day", month=11, day=11, observance=nearest_workday),
USThanksgivingDay,
Holiday("Christmas", month=12, day=25, observance=nearest_workday),
]
由于屬性是在類上定義的,因此只參考了一個底層串列,因此如果對該類的不同實體的操作都嘗試編輯串列,那么您將有一些不需要的行為。這是一個示例,顯示了正在發生的事情:
>>> class A:
... rules = [0,1,2]
...
>>> a1 = A()
>>> a2 = A()
>>> a1.rules.pop()
2
>>> a1.rules.pop()
1
>>> a2.rules.pop()
0
>>> a2.rules.pop()
IndexError: pop from empty list
>>> a3 = A()
>>> a3.rules
[]
另外,python中的每個模塊只匯入一次
uj5u.com熱心網友回復:
# Import your library
from pandas.tseries.holiday import USFederalHolidayCalendar
# Get an id of 'columbus' in 'rules' list
columbus_index = USFederalHolidayCalendar().rules.index([i for i in USFederalHolidayCalendar().rules if 'Columbus' in str(i)][0])
# Create your own class, inherit 'USFederalHolidayCalendar'
class USFederalHolidayCalendar(USFederalHolidayCalendar):
# Exclude 'columbus' entry
rules = USFederalHolidayCalendar().rules[:columbus_index] USFederalHolidayCalendar().rules[columbus_index 1:]
# Create an object from your class
cal = USFederalHolidayCalendar()
print(cal.rules)
[Holiday: New Years Day (month=1, day=1, observance=<function nearest_workday at 0x7f6afad571f0>),
Holiday: Martin Luther King Jr. Day (month=1, day=1, offset=<DateOffset: weekday=MO( 3)>),
Holiday: Presidents Day (month=2, day=1, offset=<DateOffset: weekday=MO( 3)>),
Holiday: Memorial Day (month=5, day=31, offset=<DateOffset: weekday=MO(-1)>),
Holiday: July 4th (month=7, day=4, observance=<function nearest_workday at 0x7f6afad571f0>),
Holiday: Labor Day (month=9, day=1, offset=<DateOffset: weekday=MO( 1)>),
Holiday: Veterans Day (month=11, day=11, observance=<function nearest_workday at 0x7f6afad571f0>),
Holiday: Thanksgiving (month=11, day=1, offset=<DateOffset: weekday=TH( 4)>),
Holiday: Christmas (month=12, day=25, observance=<function nearest_workday at 0x7f6afad571f0>)]
uj5u.com熱心網友回復:
[T]他的代碼位于一個函式中,該函式被重復呼叫(在回圈中)以生成多個獨立的輸出......我嘗試通過重新加載
importlib.reload無濟于事。
如果你真的想import和pop在函式內部,reload該holiday模塊就像這樣:
from importlib import reload
def f():
from pandas.tseries import holiday
# reload `holiday` and pop Columbus Day
holiday = reload(holiday)
cal = holiday.USFederalHolidayCalendar()
cal.rules.pop(6) # as HenryEcker noted, do not assign back to `cal`
# just for demo, print the first 3 letters per remaining holiday
print([rule.name[:3] for rule in cal.rules])
for _ in range(10):
f()
只是為了表明沒有Columbus 日,列印每個剩余假期的前 3 個字母:
['New', 'Mar', 'Pre', 'Mem', 'Jul', 'Lab', 'Vet', 'Tha', 'Chr']
['New', 'Mar', 'Pre', 'Mem', 'Jul', 'Lab', 'Vet', 'Tha', 'Chr']
['New', 'Mar', 'Pre', 'Mem', 'Jul', 'Lab', 'Vet', 'Tha', 'Chr']
['New', 'Mar', 'Pre', 'Mem', 'Jul', 'Lab', 'Vet', 'Tha', 'Chr']
['New', 'Mar', 'Pre', 'Mem', 'Jul', 'Lab', 'Vet', 'Tha', 'Chr']
['New', 'Mar', 'Pre', 'Mem', 'Jul', 'Lab', 'Vet', 'Tha', 'Chr']
['New', 'Mar', 'Pre', 'Mem', 'Jul', 'Lab', 'Vet', 'Tha', 'Chr']
['New', 'Mar', 'Pre', 'Mem', 'Jul', 'Lab', 'Vet', 'Tha', 'Chr']
['New', 'Mar', 'Pre', 'Mem', 'Jul', 'Lab', 'Vet', 'Tha', 'Chr']
['New', 'Mar', 'Pre', 'Mem', 'Jul', 'Lab', 'Vet', 'Tha', 'Chr']
但是如果可能的話,直接傳入cal函式,這樣你只需要生成和修改cal一次:
# define the function to accept `cal` to avoid repeated importing/reloading
def f(cal):
print([rule.name[:3] for rule in cal.rules])
# generate `cal` and pop once
from pandas.tseries.holiday import USFederalHolidayCalendar
cal = USFederalHolidayCalendar()
cal.rules.pop(6) # as HenryEcker noted, do not assign back to `cal`
for _ in range(10):
f(cal)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/318009.html
下一篇:物件作為引數而不宣告變數
