Pandas: [์ข‹์€ ์ฒซ ๋ฒˆ์งธ ์ด์Šˆ] TST: ๋ฒ ์–ด pytest.raises ํ—ˆ์šฉ ์•ˆ ํ•จ

์— ๋งŒ๋“  2020๋…„ 01์›” 14์ผ  ยท  51์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: pandas-dev/pandas

์ตœ์ข… ์‚ฌ์šฉ์ž๋Š” ๋””๋ฒ„๊น… ๋ชฉ์ ์œผ๋กœ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŠธ๋ฆฌ๊ฑฐ๋œ ์˜ค๋ฅ˜์— ๋”ฐ๋ผ ์˜ฌ๋ฐ”๋ฅธ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์•„์ด๋””์–ด๋Š” ์ด๊ฒƒ์„ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

with pytest.raises(klass):
    # Some code that raise an error

์ด์—:

with pytest.raises(klass, match=msg):
    # Some code that raise an error

pytest.raises ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค .


์ฐธ๊ณ  ์‚ฌํ•ญ:

์ œ๊ธฐ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ (์ฆ‰, ํŠน์ • ํŒฌ๋” ์•„๋‹ˆ๋‹ค ์˜๋ฏธ) ์™ธ๋ถ€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€์ด ๊ฒฝ์šฐ์—, ๋‹น์‹ ์€ ์‚ฌ์šฉํ•ด์•ผ external_error_raised ๋Œ€์‹  pytest.raises .

์˜ ์‚ฌ์šฉ external_error_raised ๊ฐ™์€ __exactly__์ž…๋‹ˆ๋‹ค pytest.raises ์˜ ์œ ์ผํ•œ ์ฐจ์ด์ ์€ ๋‹น์‹ ์ด ์ „๋‹ฌ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค match ์ธ์ˆ˜.

์˜ˆ๋ฅผ ๋“ค์–ด:

import pandas._testing as tm

def test_foo():
    with tm.external_error_raised(ValueError):
        raise ValueError("foo")

๊ธฐ์กฐ ์—ฐ์„ค:

  • ์ด ๋ฌธ์ œ๋ฅผ PR์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋ง๊ณ  ๋ถ™์—ฌ๋„ฃ์œผ์‹ญ์‹œ์˜ค.
https://github.com/pandas-dev/pandas/issues/30999

๋‹น์‹ ์˜ PR์—์„œ.

  • ์ž‘์—… ๊ณ„ํš์— ๋Œ€ํ•ด ์˜๊ฒฌ์„ ๋งํ•˜์—ฌ ์ž‘์—…์„ ๋‘ ๋ฐฐ๋กœ ํ•˜์ง€ ์•Š๋„๋ก ํ•˜์‹ญ์‹œ์˜ค(์ €๋ฅผ ์–ธ๊ธ‰ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ž‘์—… ๊ณ„ํš์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ์ˆ˜ํ–‰ํ•œ ์ž‘์—…์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค).

  • "์™„๋ฃŒ"๋กœ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•˜๋Š” ํŒŒ์ผ(๋” ์ด์ƒ ํ•  ์ผ์ด ์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ)์ด "์™„๋ฃŒ"๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ์ด์— ๋Œ€ํ•ด ์•Œ๋ ค์ฃผ๋Š” ๋Œ“๊ธ€์„ ๋‹ฌ์•„์ฃผ์„ธ์š”(๊ทธ๋ฆฌ๊ณ  @MomIsBestFriend ๋„ฃ์–ด ์ €๋ฅผ ์–ธ๊ธ‰ํ•˜์„ธ์š”.


์ „์ฒด ๋ชฉ๋ก์„ ์ง์ ‘ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

python scripts/validate_unwanted_patterns.py -vt="bare_pytest_raises" pandas/tests/

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹จ์ผ ํŒŒ์ผ์— ๋Œ€ํ•ด ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

python scripts/validate_unwanted_patterns.py -vt="bare_pytest_raises" pandas/tests/PATH/TO/SPECIFIC/FILE.py

ํŒŒ์ผ์— ๋ฒ ์–ด pytest.raises ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์Œ์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

pandas/tests/arithmetic/test_numeric.py:553:Bare pytests raise have been found. Please pass in the argument 'match' as well the exception

์ด๋Š” 553 ๋ผ์ธ์˜ pandas/tests/arithmetic/test_numeric.py ์— pytest.raises


ํ˜„์žฌ ๋ชฉ๋ก์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • [x] ํŒ๋‹ค/ํ…Œ์ŠคํŠธ/io/pytables/test_timezones.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ผ๋ฐ˜/๋ฉ”์†Œ๋“œ/test_pipe.py
  • [ ] pandas/tests/reshape/merge/test_merge_asof.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ™•์žฅ/๋ฒ ์ด์Šค/reduce.py
  • [x] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/๋ฐฐ์—ด/test_datetimelike.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ™•์žฅ/test_boolean.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ™•์žฅ/๋ฒ ์ด์Šค/getitem.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/๋ฐฐ์—ด/๋ถ€์šธ/test_arithmetic.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ™•์žฅ/๋ฒ ์ด์Šค/setitem.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ธ๋ฑ์Šค/๊ฐ„๊ฒฉ/test_astype.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/io/parser/test_network.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ™•์žฅ/test_integer.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ธ๋ฑ์‹ฑ/๋‹ค์ค‘ ์ธ๋ฑ์Šค/test_partial.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/io/parser/test_python_parser_only.py
  • [ ] ํŒฌ๋”/tests/io/test_html.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/๊ฐ์†Œ/test_stat_reductions.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/dtypes/test_inference.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”Œ๋กœํŒ…/test_hist_method.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์‹œ๋ฆฌ์ฆˆ/apply/test_series_apply.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/io/excel/test_xlrd.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ธ๋ฑ์Šค/test_common.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์œ ํ‹ธ/ํ…Œ์ŠคํŠธ_assert_series_equal.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ™•์žฅ/๋ฒ ์ด์Šค/ops.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/io/test_clipboard.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”Œ๋กœํŒ…/ํ”„๋ ˆ์ž„/ํ…Œ์ŠคํŠธ_ํ”„๋ ˆ์ž„_์ƒ‰์ƒ.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ฐฝ/๋ชจ๋ฉ˜ํŠธ/test_moments_ewm.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/io/test_gbq.py
  • [ ] ํŒ๋‹ค/ํ…Œ์ŠคํŠธ/๊ฐ์†Œ/test_reductions.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/io/test_feather.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/resample/test_resampler_grouper.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ธ๋ฑ์Šค/๋ฉ€ํ‹ฐ/ํ…Œ์ŠคํŠธ_์ธ๋ฑ์‹ฑ.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/io/test_common.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/io/test_sql.py
  • [ ] pandas/tests/plotting/test_series.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/io/test_fsspec.py
  • [ ] ํŒฌ๋”/tests/extension/test_floating.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ธ๋ฑ์Šค/๋ฉ€ํ‹ฐ/ํ…Œ์ŠคํŠธ_setops.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/reshape/test_get_dummies.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”Œ๋กœํŒ…/ํ”„๋ ˆ์ž„/ํ…Œ์ŠคํŠธ_ํ”„๋ ˆ์ž„_์„œ๋ธŒํ”Œ๋กฏ.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”Œ๋กœํŒ…/test_backend.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ผ๋ฐ˜/๋ฉ”์†Œ๋“œ/test_sample.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”Œ๋กœํŒ…/test_boxplot_method.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/io/test_parquet.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ™•์žฅ/test_string.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/io/pytables/test_complex.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ธ๋ฑ์Šค/test_numpy_compat.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/io/test_gcs.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/io/sas/test_sas7bdat.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ฐฝ/ํ…Œ์ŠคํŠธ_์ ์šฉ.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์‹œ๋ฆฌ์ฆˆ/ํ…Œ์ŠคํŠธ_ufunc.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”Œ๋กœํŒ…/ํ”„๋ ˆ์ž„/ํ…Œ์ŠคํŠธ_ํ”„๋ ˆ์ž„.py
  • [ ] pandas/tests/reshape/test_union_categoricals.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/io/json/test_ujson.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ธ๋ฑ์‹ฑ/test_coercion.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/io/pytables/test_store.py
  • [ ] ํŒฌ๋”/tests/computation/test_compat.py
  • [ ] ํŒ๋‹ค/ํ…Œ์ŠคํŠธ/io/json/test_pandas.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/io/json/test_json_table_schema.py

    - [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์Šค์นผ๋ผ/test_nat.py

๋…ธํŠธ:

ํŒŒ์ผ์ด ์ง€์†์ ์œผ๋กœ ์ด๋™/์ด๋ฆ„ ๋ณ€๊ฒฝ๋จ์— ๋”ฐ๋ผ ๋ชฉ๋ก์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


@gfyoung์ด ์ฒ˜์Œ ์—ด์—ˆ๋˜ #23922์—์„œ ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.

Style Testing good first issue

๋ชจ๋“  51 ๋Œ“๊ธ€

๋‚ด๊ฐ€ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค:

  • [x] ํŒ๋‹ค/ํ…Œ์ŠคํŠธ/test_common.py
  • [x] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ…Œ์ŠคํŠธ_๋‹ค์šด์ŠคํŠธ๋ฆผ.py
  • [x] pandas/tests/test_errors.py
  • [x] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/test_lib.py
  • [x] ํŒ๋‹ค/ํ…Œ์ŠคํŠธ/test_take.py
  • [x] pandas/tests/internals/test_internals.py
  • [x] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ฐฝ/ํ…Œ์ŠคํŠธ_๋กค๋ง.py

๋‹ค์Œ ์ž‘์—…์„ ์‹œ์ž‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์‚ฐ์ˆ /test_numeric.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์‚ฐ์ˆ /test_object.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์‚ฐ์ˆ /test_period.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์‚ฐ์ˆ /test_timedelta64.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/๋ฐฐ์—ด/๊ฐ„๊ฒฉ/test_interval.py

@gdex1 ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค :)

(์ˆซ์ž๋Š” ์ค„ ๋ฒˆํ˜ธ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค)

pandas/tests/arithmetic/test_numeric.py:138
pandas/tests/arithmetic/test_numeric.py:141
pandas/tests/arithmetic/test_numeric.py:190
pandas/tests/arithmetic/test_numeric.py:208
pandas/tests/arithmetic/test_numeric.py:210
pandas/tests/arithmetic/test_numeric.py:212
pandas/tests/arithmetic/test_numeric.py:214
pandas/tests/arithmetic/test_numeric.py:232
pandas/tests/arithmetic/test_numeric.py:234
pandas/tests/arithmetic/test_numeric.py:236
pandas/tests/arithmetic/test_numeric.py:238
pandas/tests/arithmetic/test_numeric.py:519
pandas/tests/arithmetic/test_numeric.py:610
pandas/tests/arithmetic/test_numeric.py:615
pandas/tests/arithmetic/test_numeric.py:617
pandas/tests/arithmetic/test_numeric.py:795
pandas/tests/arithmetic/test_numeric.py:798
pandas/tests/arithmetic/test_numeric.py:819
pandas/tests/arithmetic/test_object.py:140
pandas/tests/arithmetic/test_object.py:152
pandas/tests/arithmetic/test_object.py:154
pandas/tests/arithmetic/test_object.py:278
pandas/tests/arithmetic/test_object.py:280
pandas/tests/arithmetic/test_object.py:282
pandas/tests/arithmetic/test_object.py:284
pandas/tests/arithmetic/test_object.py:298
pandas/tests/arithmetic/test_object.py:301
pandas/tests/arithmetic/test_object.py:315
pandas/tests/arithmetic/test_object.py:318



md5-634e15eb80aa764171dbacd11a06b70b



pandas/tests/arithmetic/test_timedelta64.py:51
pandas/tests/arithmetic/test_timedelta64.py:445
pandas/tests/arithmetic/test_timedelta64.py:607
pandas/tests/arithmetic/test_timedelta64.py:609
pandas/tests/arithmetic/test_timedelta64.py:703
pandas/tests/arithmetic/test_timedelta64.py:705
pandas/tests/arithmetic/test_timedelta64.py:707
pandas/tests/arithmetic/test_timedelta64.py:709
pandas/tests/arithmetic/test_timedelta64.py:741
pandas/tests/arithmetic/test_timedelta64.py:743
pandas/tests/arithmetic/test_timedelta64.py:960
pandas/tests/arithmetic/test_timedelta64.py:972
pandas/tests/arithmetic/test_timedelta64.py:1028
pandas/tests/arithmetic/test_timedelta64.py:1037
pandas/tests/arithmetic/test_timedelta64.py:1039
pandas/tests/arithmetic/test_timedelta64.py:1502
pandas/tests/arithmetic/test_timedelta64.py:1505
pandas/tests/arithmetic/test_timedelta64.py:1508
pandas/tests/arithmetic/test_timedelta64.py:1511
pandas/tests/arithmetic/test_timedelta64.py:1536
pandas/tests/arithmetic/test_timedelta64.py:1591
pandas/tests/arithmetic/test_timedelta64.py:1783
pandas/tests/arithmetic/test_timedelta64.py:1785
pandas/tests/arithmetic/test_timedelta64.py:1911
pandas/tests/arithmetic/test_timedelta64.py:1960
pandas/tests/arithmetic/test_timedelta64.py:1962
pandas/tests/arithmetic/test_timedelta64.py:1968



md5-634e15eb80aa764171dbacd11a06b70b



pandas/tests/arrays/interval/test_interval.py:155

@gfyoung ๋ชฉ๋ก์€ ์‹ค์ œ๋กœ grep -r -e "pytest.raises([a-zA-Z]*)" pandas/tests -l ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ #30755์˜ ์Šคํฌ๋ฆฝํŠธ์— ์˜ํ•ด ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค( bare_pytest_raises ๋ผ๋Š” ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์œ ํ˜•). ํ•œ ๋ฒˆ ๋ฌธ์ œ ๋ณธ๋ฌธ์— ์ง€์นจ์„ ์ž…๋ ฅํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค :์Šค๋งˆ์ผ:

@MomIsBestFriend ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค:
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/๋ฒ ์ด์Šค/test_constructors.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/๋ฒ ์ด์Šค/test_ops.py

๋‚˜๋Š” ์ด๊ฒƒ๋“ค์„ ๋Œ๋ณผ ์ˆ˜ ์žˆ๋‹ค:
@MomIsBestFriend

ํŒฌ๋”/tests/io/test_html.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/io/test_parquet.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/io/test_sql.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/io/test_stata.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”Œ๋กœํŒ…/test_backend.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”Œ๋กœํŒ…/test_boxplot_method.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”Œ๋กœํŒ…/test_frame.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”Œ๋กœํŒ…/test_hist_method.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”Œ๋กœํŒ…/test_series.py
ํŒฌ๋”/tests/reductions/test_reductions.py

@MomIsBestFriend https://github.com/pandas-dev/pandas/issues/23922์—์„œ ์ด์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ๊ฝค ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฑฐ๊ธฐ์—์„œ ๋งํ–ˆ๋“ฏ์ด ๋ฐ˜๋ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์—: ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ชจ๋“  ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ "๋งน๋ชฉ์ ์œผ๋กœ" ์ฃผ์žฅํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ ์Šค๋ ˆ๋“œ์—์„œ ๋งํ•œ ๋ช‡ ๊ฐ€์ง€: ๋‚ด๋ถ€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋กœ ์ œํ•œํ•˜๊ณ , ๋ฉ”์‹œ์ง€์˜ ๋ช‡ ๊ฐ€์ง€ ํ•ต์‹ฌ ๋‹จ์–ด๋กœ ์ผ์น˜๋ฅผ ์ œํ•œํ•˜๊ณ , ๋ณต์žกํ•œ ํŒจํ„ด์„ ํ”ผํ•˜์‹ญ์‹œ์˜ค.

๋˜ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ๊ทธ๊ฒƒ์ด ํ›Œ๋ฅญํ•˜๊ณ  ๋ช…ํ™•ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์ธ์ง€ ํ™•์ธํ•˜๊ณ  ์ด๋ฅผ ์ž ์žฌ์ ์œผ๋กœ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ๊ณผ ํ•จ๊ป˜ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฌธ์ œ์˜ ํ† ๋ก ์—์„œ ์ฃผ์˜์  ๋ชฉ๋ก์„ ์ถ”์ถœํ•˜์—ฌ ์—ฌ๊ธฐ์— ๋„ฃ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

@jorisvandenbossche

@MomIsBestFriend #23922์—์„œ ์ด์— ๋Œ€ํ•ด ๊ฝค ๋งŽ์€ ํ† ๋ก ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฑฐ๊ธฐ์—์„œ ๋งํ–ˆ๋“ฏ์ด ๋ฐ˜๋ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์—: ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ชจ๋“  ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ "๋งน๋ชฉ์ ์œผ๋กœ" ์ฃผ์žฅํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ „์ ์œผ๋กœ ๋™์˜ํ•˜์ง€๋งŒ ๋ฌธ์ œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ฃผ์žฅํ•  ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์™€ ์ฃผ์žฅํ•˜์ง€ ์•Š์„ ๊ฒƒ์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์–ด๋–ป๊ฒŒ๋“  ์ •์˜ํ•˜๊ณ  ๋™์‹œ์— ์ด ๋ฌธ์ œ๋Š” "์ดˆ๋ณด์ž ์นœํ™”์ "์ด๋ฉฐ ํ›Œ๋ฅญํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(IMO).

๋˜ํ•œ CI์—์„œ ์ด๊ฒƒ์„ ์‹œํ–‰ํ•  ๊ณ„ํš์ด๋ผ๋ฉด bare pytest raises ๊ฐ€ ์˜๋„์ ์œผ๋กœ "๋ฒ ์–ด"์ธ ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ๋“  ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค( isort: skip ์Šคํƒ€์ผ์˜ IMO ์ฃผ์„์ด๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค). ์‚ฌ๋žŒ๋“ค์€ ํŠน์ • bare pytest raise ๊ฐ€ ์˜๋„์ ์œผ๋กœ ๋ฒ ์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ ์Šค๋ ˆ๋“œ์—์„œ ๋งํ•œ ๋ช‡ ๊ฐ€์ง€: ๋‚ด๋ถ€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋กœ ์ œํ•œํ•˜๊ณ , ๋ฉ”์‹œ์ง€์˜ ๋ช‡ ๊ฐ€์ง€ ํ•ต์‹ฌ ๋‹จ์–ด๋กœ ์ผ์น˜๋ฅผ ์ œํ•œํ•˜๊ณ , ๋ณต์žกํ•œ ํŒจํ„ด์„ ํ”ผํ•˜์‹ญ์‹œ์˜ค.

๋‚ด๋ถ€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋‹น์‹ ์ด https://github.com/pandas-dev/pandas/issues/23922#issuecomment -458551763์—์„œ ์ง€์ ํ•œ ์š”์ ์„ ๋ณด์•˜๊ณ  ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด +1 ์ด์ง€๋งŒ ๋‚˜๋Š” +2 https://github.com/pandas-dev/pandas/issues/23922#issuecomment -458733117 ๋ฐ https://github.com/pandas-dev/pandas/issues/ ์—์„œ +2 (์ดํ•ด๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ) 23922#issuecomment -458735169 IMO์˜ ์ด์ต์ด ๋น„์šฉ๋ณด๋‹ค ํฌ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ๊ทธ๊ฒƒ์ด ํ›Œ๋ฅญํ•˜๊ณ  ๋ช…ํ™•ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์ธ์ง€ ํ™•์ธํ•˜๊ณ  ์ด๋ฅผ ์ž ์žฌ์ ์œผ๋กœ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ๊ณผ ํ•จ๊ป˜ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ ˆ๋Œ€์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฌธ์ œ์˜ ํ† ๋ก ์—์„œ ์ฃผ์˜์  ๋ชฉ๋ก์„ ์ถ”์ถœํ•˜์—ฌ ์—ฌ๊ธฐ์— ๋„ฃ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

#23922์—์„œ ๋Œ€ํ™”๋ฅผ ์ฝ์—ˆ์ง€๋งŒ IMO ๊ฐ€ ๋ฌธ์ œ ๋ณธ๋ฌธ์— "๋ฉ”๋ชจ"๋กœ ๋„ฃ์„ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋†“์นœ ๋ถ€๋ถ„์„ ์ง€์ ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

#23922์—์„œ ๋Œ€ํ™”๋ฅผ ์ฝ์—ˆ์ง€๋งŒ IMO๊ฐ€ ๋ฌธ์ œ ๋ณธ๋ฌธ์— "๋ฉ”๋ชจ"๋กœ ๋„ฃ์„ ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ๋ณด์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋†“์นœ ๋ถ€๋ถ„์„ ์ง€์ ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๊ทธ ๋ฌธ์ œ์—์„œ ์ถ”๊ฐ€ํ•  ๋‚ด์šฉ๋„ ๋ณ„๋กœ ์—†์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ „์ ์œผ๋กœ ๋™์˜ํ•˜์ง€๋งŒ ๋ฌธ์ œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ฃผ์žฅํ•  ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์™€ ์ฃผ์žฅํ•˜์ง€ ์•Š์„ ๊ฒƒ์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์–ด๋–ป๊ฒŒ๋“  ์ •์˜ํ•˜๊ณ  ๋™์‹œ์— ์ด ๋ฌธ์ œ๋Š” "์ดˆ๋ณด์ž ์นœํ™”์ "์ด๋ฉฐ ํ›Œ๋ฅญํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(IMO).

๋˜ํ•œ, CI์—์„œ ์ด๊ฒƒ์„ ์‹œํ–‰ํ•  ๊ณ„ํš์ด๋ผ๋ฉด, ๋ฒ ์–ด pytest๊ฐ€ ์ œ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ์˜๋„์ ์œผ๋กœ "๋ฒ ์–ด"์ธ ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ๋“  ํ‘œ์‹œํ•ด์•ผ ํ•˜๋ฉฐ(isort ์Šคํƒ€์ผ์˜ IMO ์ฃผ์„: ๊ฑด๋„ˆ๋›ฐ๊ธฐ๊ฐ€ ์ถฉ๋ถ„ํ•จ), ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋„ ํŠน์ • ๋ฒ ์–ด pytest ์ธ์ƒ์€ ์˜๋„์ ์œผ๋กœ ๋ฒ ์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธํ•  ํ•ญ๋ชฉ๊ณผ ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š์„ ํ•ญ๋ชฉ์„ ์„ ํƒํ•˜๊ณ  ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ๋‚ด๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ๋ฐฉํ–ฅ์ด ์•„๋‹Œ ๋ถ€๋ถ„์ ์ธ ์ด์œ ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋•Œ๋•Œ๋กœ except ๋ธ”๋ก์—์„œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ๋ฌธ์ž์—ด์„ ํ™•์ธํ•˜๋ฏ€๋กœ ์ข‹์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋Š” ๊ฐœ๋ฐœ ์ค‘์—๋„ ๋„์›€์ด ๋œ๋‹ค๊ณ  ๋ง๋ถ™์˜€์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด๋Ÿฌํ•œ "๋‚ด๋ถ€" ๋ฉ”์‹œ์ง€๊ฐ€ ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ฒ˜์Œ์— ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฉ”์‹œ์ง€๊ฐ€ ๋น„์–ด ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋Š” ๋„์šฐ๋ฏธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‚ด๋ถ€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์ง€ ์•Š์€ ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๊ทธ๋ž˜์„œ ์ €๋Š” "๋‚ด๋ถ€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋กœ ์ œํ•œ"์ด๋ผ๊ณ  ๋งํ–ˆ์ง€๋งŒ "๋‚ด๋ถ€"๋Š” ์•ฝ๊ฐ„ ๋ชจํ˜ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค... ์ œ ๋ง์€: ํŒฌ๋” ์ž์ฒด์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์ด๊ณ  ๋ฌผ๋ก  ํ…Œ์ŠคํŠธํ•˜๋ ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์šฐ๋ฆฌ(IMO)๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ์™ธ๋ถ€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ…Œ์ŠคํŠธํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, numpy ๋˜๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์˜ค๋Š” ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค. Numpy๋Š” ๊ทธ๊ฒƒ๋“ค์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์šฐ๋ฆฌ์˜ ํ…Œ์ŠคํŠธ๋Š” numpy์˜ ์™ธ๊ด€์ƒ์˜ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ์‹คํŒจํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค(์ด๊ฒƒ์€ ๊ฐ€์„ค์ด ์•„๋‹ˆ๋ฉฐ ์ง€๋‚œ์ฃผ์— ์ผ์–ด๋‚œ ์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค).

์ด์ œ https://github.com/pandas-dev/pandas/pull/30998#discussion_r366726966 ์˜ ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ์—์„œ "๋‚ด๋ถ€"๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค ์ ˆ๋Œ€ ๋ฐœ์ƒํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ๋‚ด๋ถ€, ๊ฐœ๋ฐœ์ž ์ง€ํ–ฅ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค. IMO, ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋กœ ์ •ํ™•ํ•˜๊ฒŒ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด #23922(๋Œ“๊ธ€)์—์„œ ์ง€์ ํ•œ ์š”์ ์„ ๋ณด์•˜๊ณ  ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด +1์ด์ง€๋งŒ #23922(๋Œ“๊ธ€)๊ณผ #23922(๋Œ“๊ธ€)์— ๋Œ€ํ•ด์„œ๋Š” +2(์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๋ฉด)์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด IMO ์ด์ต์ด ๋น„์šฉ๋ณด๋‹ค ํฝ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๋งํฌํ•˜๋Š” @simonjayhawkins ์˜ ์˜๊ฒฌ์„ ๋„ฃ์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฐ€์ •์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ ์‹๋ณ„
  2. ๋ถ„ํ• ํ•ด์•ผ ํ•˜๋Š” ํ…Œ์ŠคํŠธ ์‹๋ณ„
  3. ํ…Œ์ŠคํŠธ๋œ ๊ณ ์žฅ ๋ชจ๋“œ์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ์ดํ•ด
  4. ํ…Œ์ŠคํŠธ์— ๊ฐ„์ ‘์ ์œผ๋กœ ๋” ๋งŽ์€ ๋ฌธ์„œ ์ถ”๊ฐ€
  5. ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์˜ ์ผ๊ด€์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜ ์‹๋ณ„
  6. ์ค‘๋ณต๋˜๋Š” ํ…Œ์ŠคํŠธ ์‹๋ณ„
  7. ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ๊ฐœ์„ ์— ๋„์›€
  8. ์ž˜๋ชป๋œ ์ด์œ ๋กœ ํ˜„์žฌ ํ†ต๊ณผ ์ค‘์ธ ํ…Œ์ŠคํŠธ๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋‘ ์œ ์šฉํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์œผ๋ฉฐ ์šฐ๋ฆฌ๊ฐ€ ์ด ๋ฌธ์ œ์—์„œ ๊ทธ๋Ÿฐ ๊ฒƒ๋“ค์„ ์–ป๊ณ ์ž ํ•œ๋‹ค๋ฉด ์ด ๋ฌธ์ œ๋Š” ์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ดˆ๋ณด์ž๋Š” ์ด ๋ชจ๋“  ์ž‘์—…์„ ํ•œ ๋ฒˆ์— ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ ์ฃผ์žฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” PR์ด ์•„๋ฌด ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  "ํ˜„์žฌ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ pytest.raises ํ˜ธ์ถœ์— ๋งน๋ชฉ์ ์œผ๋กœ ์ถ”๊ฐ€"ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ๋‹ค๋Š” ๋Š๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค. ๋” ๋‚˜์•„๊ฐ€(์œ„์˜ ์‚ฌํ•ญ).

๋˜ํ•œ, ์œ„์˜ ์‚ฌํ•ญ๋“ค์ด ์ด ์—ฐ์Šต์„ ์œ ์šฉํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค๋ฉด, ์ด ๋ฌธ์ œ์˜ ๋งจ ์œ„์— ๋‘๋Š” ๊ฒƒ์ด ์œ ์šฉํ•œ ์ด์— ๋Œ€ํ•œ ๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ ์ง€์นจ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.


๋ถ„๋ช…ํžˆ ํ•˜์ž๋ฉด, ์ €๋Š” ๋” ๋‚˜์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์™€ ๋” ๋‚˜์€ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์ž˜
IMO, ๋Œ€์‹  "์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ๊ฐœ์„ "์— ์ดˆ์ ์„ ๋งž์ถ”๋Š” ๊ฒƒ๋ณด๋‹ค "๋ฒ ์–ด pytest ๋ฐœ์ƒ ์ˆ˜์ •"์— ์ดˆ์ ์„ ๋งž์ถ”๋Š” ๊ฒƒ์ด ๋” ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ด๋ ‡๊ฒŒ ํ•˜๋Š” ๋™์•ˆ ๋” ์ž˜ ํ…Œ์ŠคํŠธ).

๋˜ํ•œ, ์œ„์˜ ์‚ฌํ•ญ๋“ค์ด ์ด ์—ฐ์Šต์„ ์œ ์šฉํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค๋ฉด, ์ด ๋ฌธ์ œ์˜ ๋งจ ์œ„์— ๋‘๋Š” ๊ฒƒ์ด ์œ ์šฉํ•œ ์ด์— ๋Œ€ํ•œ ๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ ์ง€์นจ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ๋” ํฐ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ด๋Ÿฌํ•œ ๋ฌธ์ œ์— ํฌํ•จํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” https://github.com/pandas-dev/pandas/issues/19159 ๋ฐ https://github.com/pandas-์ž…๋‹ˆ๋‹ค. dev/pandas/issues/21575).

์ด ๋ถ€๋ถ„ ์ž์ฒด๊ฐ€ ๋…๋ฆฝ์ ์ด๋ฉฐ ์ดˆ๋ณด์ž๊ฐ€ ์ ‘๊ทผํ•˜๊ธฐ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

@gfyoung ์ด ํ† ๋ก ๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋งํฌํ•œ ๋ฌธ์ œ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

@simonjayhawkins ์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ์†Œ๊ฐœํ•œ ๋Œ“๊ธ€๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

31072 stata.py ์— ํ•˜๋‚˜์˜ ๋ˆ„๋ฝ๋œ ์ผ์น˜ ํ•ญ๋ชฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ๋งํ–ˆ๋“ฏ์ด https://github.com/pandas-dev/pandas/pull/31091#issuecomment -575422207 ์ €๋Š” @jorisvandenbossche ์˜ ์•„์ด๋””์–ด์—

ํŠน์ • ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด(์™ธ๋ถ€ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•ด ์–ด๋Š ์ชฝ์ด๋“  ๊ณต์ •ํ•˜๊ฒŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ) ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋„์šฐ๋ฏธ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

~ํŒŒ์ด์ฌdef ์™ธ๋ถ€ ์˜ค๋ฅ˜ ๋ฐœ์ƒ(์˜ˆ์ƒ_์˜ˆ์™ธ):๋ฐ˜ํ™˜ pytest.raises(์˜ˆ์ƒ_์˜ˆ์™ธ, ์ผ์น˜=์—†์Œ)~

์ด๊ฒƒ์€ ์ด๊ฒƒ์ด ํŒฌ๋”๊ฐ€ ์•„๋‹Œ ์˜ค๋ฅ˜๋ผ๋Š” ๊ฒƒ์„ ์šฐ๋ฆฌ์˜ ๋ฏธ๋ž˜ ์ž์•„์—๊ฒŒ ๋ถ„๋ช…ํžˆ ํ•  ๊ฒƒ์ด๋ฉฐ match=None ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ฒŒ๊ฑฐ๋ฒ—์€ pytest ์ธ์ƒ์„ ์œ„ํ•ด ๊ฐœ๋ฐœํ•œ ๋ชจ๋“  ๋ฆฐํŠธ ๊ฒ€์‚ฌ๋ฅผ ์ง„์ •์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ • ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด(์™ธ๋ถ€ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•ด ์–ด๋Š ์ชฝ์ด๋“  ๊ณต์ •ํ•˜๊ฒŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ) ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋„์šฐ๋ฏธ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

def external_error_raised(expected_exception):
   return pytest.raises(expected_exception, match=None)

์ด๊ฒƒ์€ ์ด๊ฒƒ์ด ํŒฌ๋”๊ฐ€ ์•„๋‹Œ ์˜ค๋ฅ˜๋ผ๋Š” ๊ฒƒ์„ ์šฐ๋ฆฌ์˜ ๋ฏธ๋ž˜ ์ž์•„์—๊ฒŒ ๋ช…๋ฐฑํ•˜๊ฒŒ ํ•  ๊ฒƒ์ด๋ฉฐ match=None ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ฒŒ๊ฑฐ๋ฒ—์€ pytest ์ธ์ƒ์„ ์œ„ํ•ด ๊ฐœ๋ฐœํ•œ ๋ชจ๋“  ๋ณดํ’€ ํ™•์ธ์„ ์ง„์ •์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

+1 .

๋‚˜๋Š” ๊ทธ ์•„์ด๋””์–ด๊ฐ€ ์ •๋ง ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ๊ด€๋ก€๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ•จ์ˆ˜/๋ฉ”์„œ๋“œ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๋Š” ์ค‘์ด๊ณ  ์˜ค๋ฅ˜๊ฐ€ ์™ธ๋ถ€ ์˜ค๋ฅ˜์ธ ๊ฒฝ์šฐ "pytest.raises```์— match=None ๋ฅผ ๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ๊ทœ์น™์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ ๋ง์€ ๊ธฐ์—ฌ ๊ฐ€์ด๋“œ ์— ์„น์…˜์„ ๋„ฃ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

ํ•จ์ˆ˜/๋ฉ”์„œ๋“œ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๋Š” ์ค‘์ด๊ณ  ์˜ค๋ฅ˜๊ฐ€ ์™ธ๋ถ€ ์˜ค๋ฅ˜์ธ ๊ฒฝ์šฐ "pytest.raises```์— match=None์„ ๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋„์šฐ๋ฏธ ์ด๋ฆ„์€ ์šฐ๋ฆฌ๊ฐ€ ์™œ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ํ›จ์”ฌ ๋” ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ • ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด(์™ธ๋ถ€ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•ด ์–ด๋Š ์ชฝ์ด๋“  ๊ณต์ •ํ•˜๊ฒŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Œ) ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋„์šฐ๋ฏธ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

def external_error_raised(expected_exception):
   return pytest.raises(expected_exception, match=None)

์ด๊ฒƒ์€ ์ด๊ฒƒ์ด ํŒฌ๋”๊ฐ€ ์•„๋‹Œ ์˜ค๋ฅ˜๋ผ๋Š” ๊ฒƒ์„ ์šฐ๋ฆฌ์˜ ๋ฏธ๋ž˜ ์ž์•„์—๊ฒŒ ๋ช…๋ฐฑํ•˜๊ฒŒ ํ•  ๊ฒƒ์ด๋ฉฐ match=None ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ฒŒ๊ฑฐ๋ฒ—์€ pytest ์ธ์ƒ์„ ์œ„ํ•ด ๊ฐœ๋ฐœํ•œ ๋ชจ๋“  ๋ณดํ’€ ํ™•์ธ์„ ์ง„์ •์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

@gfyoung ์ด ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ์„ ์–ด๋””์— ๋‘๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๊นŒ? (์–ด๋–ค ํŒŒ์ผ์— ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ?)

pandas._testing

์•ˆ๋…•ํ•˜์‹ญ๋‹ˆ๊นŒ,

๋‹ค์Œ ์ž‘์—…์„ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

ํŒฌ๋”/ํ…Œ์ŠคํŠธ/๋ฐฐ์—ด/๊ฐ„๊ฒฉ/test_ops.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/๋ฐฐ์—ด/test_array.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/๋ฐฐ์—ด/test_boolean.py

์•ˆ๋…•ํ•˜์„ธ์š” - ์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์„ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์‚ฐ์ˆ /test_period.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์‚ฐ์ˆ /test_timedelta64.py

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํŒฌ๋”/ํ…Œ์ŠคํŠธ/๊ณ„์‚ฐ/test_compat.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/๊ณ„์‚ฐ/test_eval.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/dtypes/cast/test_upcast.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/dtypes/test_dtypes.py

@MomIsBestFriend ์ด๊ฒƒ์€ ์ด๋ฏธ ์™„๋ฃŒ๋˜์—ˆ์ง€๋งŒ ์™„๋ฃŒ๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์‚ฐ์ˆ /test_numeric.py

์—…๋ฐ์ดํŠธ

@MomIsBestFriend ์ด๊ฒƒ๋“ค๋„:
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์‚ฐ์ˆ /test_period.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/๋ฐฐ์—ด/test_integer.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/๋ฐฐ์—ด/test_period.py

์ด๋“ค์€ #31852์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒฌ๋”/tests/extension/decimal/test_decimal.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ™•์žฅ/json/test_json.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ™•์žฅ/test_boolean.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ™•์žฅ/test_categorical.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”„๋ ˆ์ž„/์ธ๋ฑ์‹ฑ/test_categorical.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”„๋ ˆ์ž„/์ธ๋ฑ์‹ฑ/test_indexing.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”„๋ ˆ์ž„/์ธ๋ฑ์‹ฑ/test_where.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”„๋ ˆ์ž„/๋ฉ”์†Œ๋“œ/test_explode.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”„๋ ˆ์ž„/๋ฉ”์†Œ๋“œ/test_isin.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”„๋ ˆ์ž„/๋ฉ”์†Œ๋“œ/test_quantile.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”„๋ ˆ์ž„/๋ฉ”์†Œ๋“œ/test_round.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”„๋ ˆ์ž„/๋ฉ”์†Œ๋“œ/test_sort_values.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”„๋ ˆ์ž„/๋ฉ”์†Œ๋“œ/test_to_dict.py

๋‚ด๊ฐ€ ๊ฐ€์ ธ๊ฐˆ๊ฒŒ

ํŒฌ๋”/ํ…Œ์ŠคํŠธ/io/excel/test_readers.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/io/excel/test_writers.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/io/excel/test_xlwt.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/io/formats/test_format.py
ํŒฌ๋”/tests/io/formats/test_style.py
ํŒฌ๋”/tests/io/formats/test_to_latex.py

@MomIsBestFriend
๋‹ค์Œ์€ ํ‘œ์‹œ ์—†์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

  • ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ธ๋ฑ์Šค/datetimes/test_astype.py

pandas/tests/indexes/datetimes/test_tools.py๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

๋‚ด๊ฐ€ ํ• ๊ฑฐ์•ผ:

  • pandas/tests/indexes/datetimes/test_constructors.py
  • ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ธ๋ฑ์Šค/datetimes/test_date_range.py
  • ํŒฌ๋”/tests/indexes/datetimes/test_indexing.py
  • ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ธ๋ฑ์Šค/datetimes/test_shift.py
  • ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ธ๋ฑ์Šค/datetimes/test_timezones.py

pytest raises ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์›๋ณธ ๊ฒŒ์‹œ๋ฌผ์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ง€์นจ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์งˆ๋ฌธ์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์œผ๋ฉด ์–ธ์ œ๋“ ์ง€ ๋ฌผ์–ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. :)

๋‚ด๊ฐ€ ๊ฐ€์ ธ๊ฐˆ๊ฒŒ,

ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์‚ฐ์ˆ /test_timedelta64.py

ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์Šค์นผ๋ผ/ํƒ€์ž„์Šคํƒฌํ”„/test_arithmetic.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์Šค์นผ๋ผ/ํƒ€์ž„์Šคํƒฌํ”„/test_comparisons.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์Šค์นผ๋ผ/ํƒ€์ž„์Šคํƒฌํ”„/test_constructors.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์Šค์นผ๋ผ/ํƒ€์ž„์Šคํƒฌํ”„/test_timezones.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์Šค์นผ๋ผ/ํƒ€์ž„์Šคํƒฌํ”„/test_unary_ops.py

pandas/tests/scalar/timestamp/์˜ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์ด๋ฏธ ์ˆ˜์ •๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$ git checkout master
Already on 'master'
$ python scripts/validate_unwanted_patterns.py -vt="bare_pytest_raises"  pandas/tests/scalar/timestamp/
$ 

pandas/tests/arrays/test_boolean.py =>์ด(๊ฐ€) ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ฑ™๊ธธ๊ฑฐ๋‹ค
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/๋ฐฐ์—ด/๊ฐ„๊ฒฉ/test_ops.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/๋ฐฐ์—ด/test_datetimelike.py

ํŒฌ๋”/tests/groupby/test_categorical.py
ํŒฌ๋”/tests/groupby/test_groupby.py
ํŒฌ๋”/tests/groupby/test_timegrouper.py

ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์‚ฐ์ˆ /test_timedelta64.py => #33010

pandas/tests/scalar/timestamp/test_arithmetic.py => ๋ฌธ์ œ ์—†์Œ
pandas/tests/scalar/timestamp/test_comparisons.py => ๋ฌธ์ œ ์—†์Œ
pandas/tests/scalar/timestamp/test_constructors.py => ๋ฌธ์ œ ์—†์Œ
pandas/tests/scalar/timestamp/test_timezones.py => ๋ฌธ์ œ ์—†์Œ
pandas/tests/scalar/timestamp/test_unary_ops.py => ๋ฌธ์ œ ์—†์Œ

pandas/tests/arrays/test_boolean.py =>์ด(๊ฐ€) ์—†์Šต๋‹ˆ๋‹ค.

pandas/tests/arrays/interval/test_ops.py => #33010
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/๋ฐฐ์—ด/test_datetimelike.py => #33010

pandas/tests/groupby/test_categorical.py => #33144
pandas/tests/groupby/test_groupby.py => ๋ฌธ์ œ ์—†์Œ
pandas/tests/groupby/test_timegrouper.py => ๋ฌธ์ œ ์—†์Œ

pandas/tests/indexes/categorical/test_category.py => ๋ฌธ์ œ ์—†์Œ
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ธ๋ฑ์Šค/common.py #33144
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ธ๋ฑ์Šค/datetimelike.py #33144

pandas/tests/indexes/interval/test_astype.py => ์˜ํ–ฅ์„ ๋ฐ›๋Š” ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ xfailed๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์–ด๋–ป๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ?

pandas/tests/indexes/multi/test_compat.py #33144
pandas/tests/indexes/multi/test_duplicates.py => ๋ฌธ์ œ ์—†์Œ
pandas/tests/indexes/multi/test_format.py => ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
pandas/tests/indexes/multi/test_reshape.py #33144
pandas/tests/indexes/multi/test_setops.py => ๋ฌธ์ œ ์—†์Œ
pandas/tests/indexes/multi/test_sorting.py #33144

@sumanau7 ์‚ฌ์šฉ ์ค‘์ธ ํŒŒ์ผ์„ ๋‚˜์—ดํ–ˆ์Šต๋‹ˆ๊นŒ? ๋ณ‘ํ•ฉ๋œ ํŒŒ์ผ ์ค‘ ์ผ๋ถ€๋ฅผ ์ž‘์—… ์ค‘์ž…๋‹ˆ๋‹ค.

์™„๋ฃŒ

pandas/tests/indexes/categorical/test_category.py
pandas/tests/indexes/period/test_constructors.py
pandas/tests/indexes/period/test_join.py
pandas/tests/indexes/period/test_partial_slicing.py
pandas/tests/indexes/period/test_setops.py
pandas/tests/indexes/timedeltas/test_delete.py

๋‚˜๋Š” ํ•จ๊ป˜ ์ผํ•˜๊ณ ์žˆ๋‹ค

pandas/tests/indexes/ranges/test_constructors.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ธ๋ฑ์Šค/๋ฒ”์œ„/test_range.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ธ๋ฑ์‹ฑ/๋‹ค์ค‘ ์ธ๋ฑ์Šค/test_chaining_and_caching.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ธ๋ฑ์‹ฑ/๋‹ค์ค‘ ์ธ๋ฑ์Šค/test_partial.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์‹œ๋ฆฌ์ฆˆ/์ธ๋ฑ์‹ฑ/test_alter_index.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/๋ฐฐ์—ด/๋ถ€์šธ/test_function.py

์ž‘์—…:

pandas/tests/reshape/merge/test_multi.py

๋‚ด๊ฐ€ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค:
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ฐฝ/์ˆœ๊ฐ„/test_moments_ewm.py
ํŒฌ๋”/tests/window/moments/test_moments_rolling.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ฐฝ/test_dtypes.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ฐฝ/test_ewm.py
ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ฐฝ/test_expanding.py
ํŒฌ๋”/tests/window/test_timeseries_window.py

๋˜ํ•œ ๋‹ค์Œ์„ ์ทจํ•ฉ๋‹ˆ๋‹ค.

  • ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”„๋ ˆ์ž„/๋ฉ”์†Œ๋“œ/test_assign.py
  • ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”„๋ ˆ์ž„/๋ฉ”์†Œ๋“œ/test_at_time.py
  • ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”„๋ ˆ์ž„/๋ฉ”์†Œ๋“œ/test_between_time.py
  • ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”„๋ ˆ์ž„/๋ฉ”์†Œ๋“œ/test_first_and_last.py
  • ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”„๋ ˆ์ž„/๋ฉ”์†Œ๋“œ/test_interpolate.py
  • ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”„๋ ˆ์ž„/๋ฉ”์†Œ๋“œ/test_replace.py
  • ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ”„๋ ˆ์ž„/test_query_eval.py

์•ˆ๋…•ํ•˜์„ธ์š”,
์ €๋Š” ์ด ํ”„๋กœ์ ํŠธ์˜ ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž์ด๋ฉฐ ์ด ๋ฌธ์ œ๋ฅผ ๋•๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ํ…Œ์ŠคํŠธ ์ค‘ ์ดˆ๋ณด์ž์—๊ฒŒ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ํ…Œ์ŠคํŠธ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ฐ์‚ฌ ํ•ด์š”,
์ผ€๋นˆ

์•ˆ๋…•ํ•˜์„ธ์š”,
์ €๋Š” ์ด ํ”„๋กœ์ ํŠธ์˜ ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ์ž์ด๋ฉฐ ์ด ๋ฌธ์ œ๋ฅผ ๋•๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ํ…Œ์ŠคํŠธ ์ค‘ ์ดˆ๋ณด์ž์—๊ฒŒ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ํ…Œ์ŠคํŠธ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ฐ์‚ฌ ํ•ด์š”,
์ผ€๋นˆ

ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค - ์ด ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๋‹ค๋ฅธ ๊ฒƒ๋ณด๋‹ค ์‰ฝ๊ฑฐ๋‚˜ ์–ด๋ ต์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‹œ์ž‘ํ•˜๊ธฐ์— ์ข‹์€ ๊ณณ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

validate_unwanted_patterns.py ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Traceback (most recent call last):
  File "C:\Users\Kevom\git\pandas\scripts\validate_unwanted_patterns.py", line 397, in <module>
    main(
  File "C:\Users\Kevom\git\pandas\scripts\validate_unwanted_patterns.py", line 352, in main
    for line_number, msg in function(file_obj):
  File "C:\Users\Kevom\git\pandas\scripts\validate_unwanted_patterns.py", line 88, in bare_pytest_raises
    contents = file_obj.read()
  File "C:\Program Files (x86)\Python\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 76843: character maps to <undefined>

'pandas/tests/test_strings.py'๋ฅผ ์ฝ์„ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํŒŒ์ผ์€ cp1252๋กœ ์ธ์ฝ”๋”ฉ๋ฉ๋‹ˆ๋‹ค.

์ค‘๋ณต ์ž‘์—…์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ํ…Œ์ŠคํŠธ๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ NotImplementedError ์—๋Š” ์ผ์น˜์‹œํ‚ฌ ํŠน์ • ๋ฉ”์‹œ์ง€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ชฉ์ ์— ์–ด๊ธ‹๋‚œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๋ฆฐํ„ฐ๋ฅผ ์นจ๋ฌต์‹œํ‚ค๊ธฐ ์œ„ํ•ด pytest.raises(NotImplementedError, match=None) ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ?

๋‚ด๊ฐ€ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค:

  • ํŒฌ๋”/ํ…Œ์ŠคํŠธ/๋„๊ตฌ/test_to_datetime.py
  • ํŒฌ๋”/ํ…Œ์ŠคํŠธ/tseries/offsets/test_offsets.py

์‹œ์ž‘ํ•œ๋‹ค.

- ์ผ€๋นˆ

๋‚˜๋Š” ์ด๊ฒƒ์— ์ต์ˆ™ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œ์ž‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ํŒฌ๋”/ํ…Œ์ŠคํŠธ/tseries/offsets/test_ticks.py

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋Š” ๊ธฐ์—ฌ์— ์ฒ˜์Œ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋ช…ํ™•ํ•˜๊ฒŒ ์ž‘์„ฑํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. pandas/tests/generic/test_duplicate_labels.py ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ณ  ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๋ฉด ๋ช‡ ๊ฐ€์ง€ ๋” ๋‹ค๋ฃฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” pandas/tests/arrays/test_datetimelike.py๋ฅผ ์‹œ์ž‘์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋˜ํ•œ python scripts/validate_unwanted_patterns.py -vt="bare_pytest_raises" pandas/tests/ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์œผ๋ฉด ๋‹ค์Œ์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.
๋Œ€์‹  python scripts/validate_unwanted_patterns.py -vt="bare_pytest_raises" pandas/tests/**/*.py

์ง€๊ธˆ ์‹คํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    -   id: unwanted-patterns-bare-pytest-raises
        name: Check for use of bare use of pytest raises
        language: python
        entry: python scripts/validate_unwanted_patterns.py --validation-type="bare_pytest_raises"
        types: [python]
        files: ^pandas/tests/

- repo: local ์„น์…˜์—์„œ .pre-commit-config.yaml ๋กœ ๋ณ€๊ฒฝํ•œ ๋‹ค์Œ ์‹คํ–‰

pre-commit run unwanted-patterns-bare-pytest-raises --all-files.

๋‚˜๋จธ์ง€ ๋ฏธํ•ด๊ฒฐ ํŒŒ์ผ๋กœ ๋ฌธ์ œ๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ๊ฐ€์ง€๊ณ  ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค:

  • [x] ํŒ๋‹ค/ํ…Œ์ŠคํŠธ/io/pytables/test_timezones.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/์ผ๋ฐ˜/๋ฉ”์†Œ๋“œ/test_pipe.py
  • [ ] pandas/tests/reshape/merge/test_merge_asof.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ™•์žฅ/๋ฒ ์ด์Šค/reduce.py
  • [ ] ํŒฌ๋”/ํ…Œ์ŠคํŠธ/ํ™•์žฅ/๋ฒ ์ด์Šค/getitem.py
  • ํŒฌ๋”/ํ…Œ์ŠคํŠธ/๋ฐฐ์—ด/test_datetimelike.py

์ด๋“ค์€ ์˜ค๋Š˜ ํ˜„์žฌ ๋ชฉ๋ก์—์„œ ์ƒ์œ„ 5๊ฐœ์ž…๋‹ˆ๋‹ค.

@marktgraham ์•„์ง test_datetime.py ์„ ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด. PR์„ ํ•˜๋ ค๊ณ  ํ•˜๋‹ˆ ๊ทธ๋ƒฅ ๋‘์„ธ์š”.

@liaoaoyuan97 ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”. ์•„์ง test_datetimelike.py ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋Œ€์‹  pandas/tests/extension/base/getitem.py๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

validate_unwanted_patterns.py ๋‚ด ์ชฝ์—์„œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ

$ python scripts/validate_unwanted_patterns.py -vt="bare_pytest_raises" pandas/tests/
Traceback (most recent call last):
  File "scripts/validate_unwanted_patterns.py", line 479, in <module>
    output_format=args.format,
  File "scripts/validate_unwanted_patterns.py", line 435, in main
    with open(file_path, encoding="utf-8") as file_obj:
IsADirectoryError: [Errno 21] Is a directory: 'pandas/tests/'

์•„๋งˆ๋„ #37419์™€ ๊ด€๋ จ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ์š”?

@MarcoGorelli๊ฐ€ ์ œ์•ˆํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‹œ๋„ํ–ˆ๊ณ  ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ ์‹คํ–‰ํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    -   id: unwanted-patterns-bare-pytest-raises
        name: Check for use of bare use of pytest raises
        language: python
        entry: python scripts/validate_unwanted_patterns.py --validation-type="bare_pytest_raises"
        types: [python]
        files: ^pandas/tests/

- repo: local ์„น์…˜์—์„œ .pre-commit-config.yaml ๋กœ ๋ณ€๊ฒฝํ•œ ๋‹ค์Œ ์‹คํ–‰

pre-commit run unwanted-patterns-bare-pytest-raises --all-files.

์ด๊ฒƒ์„ .pre-commit-config.yaml ์— ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ ์ด ์Šค๋ ˆ๋“œ์˜ ์ง€์นจ์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๊นŒ?

์ด๊ฒƒ์„ .pre-commit-config.yaml์— ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ ์ด ์Šค๋ ˆ๋“œ์˜ ์ง€์นจ์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ์˜ค๋ฅ˜๊ฐ€ ์ˆ˜์ •๋˜๋ฉด .pre-commit-config.yaml ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ

์•„๋งˆ๋„ #37419์™€ ๊ด€๋ จ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ์š”?

์•„๋‹ˆ์š”, #37379์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค(์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์ „ ์ปค๋ฐ‹์œผ๋กœ ์˜ฎ๊ฒผ์œผ๋ฏ€๋กœ ๋” ์ด์ƒ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ์‹คํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค)

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰