Datetime Conversion Function.
了解しました。指定されたテキスト形式の日付をPythonの datetime
型に変換する関数を以下に示します。
pythonfrom datetime import datetime
def str_to_datetime(date_str: str) -> datetime:
# 2023年8月5日 形式
if "年" in date_str and "月" in date_str and "日" in date_str:
return datetime.strptime(date_str, '%Y年%m月%d日')
# 2023/8/5 形式
elif "/" in date_str:
return datetime.strptime(date_str, '%Y/%m/%d')
else:
raise ValueError("Unsupported date format.")
この関数は、指定された2つの形式(2023年8月5日 および 2023/8/5)のいずれかにマッチする日付文字列を datetime
型に変換します。それ以外の形式の文字列が入力された場合は、ValueErrorが発生します。
申し訳ございません。関数の定義を再度入力して、テストを行います。
テストが成功しました。関数 str_to_datetime
は、指定されたテキスト形式の日付を正確にPythonの datetime
型に変換できることが確認されました。
ValueError
が期待通りに発生しました。不正な日付形式を関数に渡すと、"Unsupported date format."というエラーメッセージが返されます。
了解しました。pytest
を使って、str_to_datetime
関数のテストベンチを作成します。以下に、さまざまなケースを考慮したテストコードを示します。
pythonimport pytest
from datetime import datetime
# str_to_datetime 関数の定義は既に与えられていると仮定します。
# 正常な入力値と期待される出力値のペア
valid_test_cases = [
("2023年8月5日", datetime(2023, 8, 5)),
("2023/8/5", datetime(2023, 8, 5)),
("2000年1月1日", datetime(2000, 1, 1)),
("1999/12/31", datetime(1999, 12, 31)),
("2030年2月29日", datetime(2030, 2, 29)), # 閏年のテスト
("2023/12/31", datetime(2023, 12, 31)),
("2023年1月31日", datetime(2023, 1, 31)),
("2023/2/28", datetime(2023, 2, 28)),
("2023年4月30日", datetime(2023, 4, 30)),
("2023/6/30", datetime(2023, 6, 30))
]
# エラーが期待される入力値
invalid_test_cases = [
"2023.08.05",
"08/05/2023",
"2023年2月30日",
"2023/4/31",
"2023年13月1日",
"2023/0/1",
"2023年0月1日",
"2023/12/0",
"2023年2月0日",
"abcd"
]
@pytest.mark.parametrize("input_value, expected_output", valid_test_cases)
def test_valid_str_to_datetime(input_value, expected_output):
assert str_to_datetime(input_value) == expected_output
@pytest.mark.parametrize("input_value", invalid_test_cases)
def test_invalid_str_to_datetime(input_value):
with pytest.raises(ValueError):
str_to_datetime(input_value)
このコードには、10個の正常な入力と期待される出力のペアと、10個のエラーが期待される入力の2つのリストが含まれています。pytest.mark.parametrize
を使用して、これらのテストケースを効率的に実行します。
申し訳ございませんが、私の現在の環境では直接 pytest
を実行することはできません。しかしながら、提供したテストコードは標準的な pytest
形式に基づいていますので、ご自身のローカル環境やCI/CDパイプラインで問題なく実行することができるはずです。
実行方法は、テストコードを test_datetime_conversion.py
などの名前のファイルに保存し、次のコマンドを実行することで確認できます:
pytest test_datetime_conversion.py
このコマンドを実行すると、pytest
が自動的にテスト関数を検出して実行し、結果を表示します。
了解しました。str_to_datetime.py
から str_to_datetime
関数をインポートするように、テストコードを修正します。
pythonimport pytest
from datetime import datetime
from str_to_datetime import str_to_datetime # こちらの行を追加
# 正常な入力値と期待される出力値のペア
valid_test_cases = [
# ... (前と同じ)
]
# エラーが期待される入力値
invalid_test_cases = [
# ... (前と同じ)
]
@pytest.mark.parametrize("input_value, expected_output", valid_test_cases)
def test_valid_str_to_datetime(input_value, expected_output):
assert str_to_datetime(input_value) == expected_output
@pytest.mark.parametrize("input_value", invalid_test_cases)
def test_invalid_str_to_datetime(input_value):
with pytest.raises(ValueError):
str_to_datetime(input_value)
この修正を適用することで、str_to_datetime.py
から関数をインポートしてテストを実行することができます。
申し訳ございません。おっしゃる通り、2030年は閏年ではありません。このテストケースは不適切でした。
正確なテストケースを提供するために、正常な入力値と期待される出力値のペアを修正します。閏年のテストのために、代わりに2024年(実際の閏年)を使用します。
以下が修正後のテストケースの一部です:
python# 正常な入力値と期待される出力値のペア
valid_test_cases = [
# ... (他のテストケースは前と同じ)
("2024年2月29日", datetime(2024, 2, 29)), # 閏年のテスト
# ...
]
この修正を適用することで、テストが正常に動作するはずです。再度実行してご確認ください。
もちろんです。以下が修正後の完全なテストコード test_datetime_conversion.py
です。
pythonimport pytest
from datetime import datetime
from str_to_datetime import str_to_datetime
# 正常な入力値と期待される出力値のペア
valid_test_cases = [
("2023年8月5日", datetime(2023, 8, 5)),
("2023/8/5", datetime(2023, 8, 5)),
("2000年1月1日", datetime(2000, 1, 1)),
("1999/12/31", datetime(1999, 12, 31)),
("2024年2月29日", datetime(2024, 2, 29)), # 閏年のテストを2024年で修正
("2023/12/31", datetime(2023, 12, 31)),
("2023年1月31日", datetime(2023, 1, 31)),
("2023/2/28", datetime(2023, 2, 28)),
("2023年4月30日", datetime(2023, 4, 30)),
("2023/6/30", datetime(2023, 6, 30))
]
# エラーが期待される入力値
invalid_test_cases = [
"2023.08.05",
"08/05/2023",
"2023年2月30日",
"2023/4/31",
"2023年13月1日",
"2023/0/1",
"2023年0月1日",
"2023/12/0",
"2023年2月0日",
"abcd"
]
@pytest.mark.parametrize("input_value, expected_output", valid_test_cases)
def test_valid_str_to_datetime(input_value, expected_output):
assert str_to_datetime(input_value) == expected_output
@pytest.mark.parametrize("input_value", invalid_test_cases)
def test_invalid_str_to_datetime(input_value):
with pytest.raises(ValueError):
str_to_datetime(input_value)
このテストコードを test_datetime_conversion.py
として保存し、pytest
で実行することで、str_to_datetime
関数の正確な動作を確認できます。
了解しました。str_to_datetime
関数の定義に英語のdocstringsを追加し、その他のコメントも英語に変更します。
pythonfrom datetime import datetime
def str_to_datetime(date_str: str) -> datetime:
"""
Convert a string representation of a date into a datetime object.
Args:
- date_str (str): String representation of a date in either "YYYY年MM月DD日" or "YYYY/MM/DD" format.
Returns:
- datetime: A datetime object representing the date.
Raises:
- ValueError: If the date_str is not in one of the supported formats or represents an invalid date.
"""
# Check for "YYYY年MM月DD日" format
if "年" in date_str and "月" in date_str and "日" in date_str:
return datetime.strptime(date_str, '%Y年%m月%d日')
# Check for "YYYY/MM/DD" format
elif "/" in date_str:
return datetime.strptime(date_str, '%Y/%m/%d')
else:
raise ValueError("Unsupported date format.")
このdocstringsは、関数の使い方、引数、戻り値、および潜在的なエラーについての情報を提供しています。これにより、関数の使用方法が明確になり、設計グループのメンバーが関数の動作を理解するのが容易になります。
了解しました。ソースコードの各行を79文字以下になるように改行を調整します。
申し訳ございませんが、コードの表示に問題が発生しました。改めて、行の長さを79文字以下に調整した str_to_datetime
関数の定義を以下に示します。
pythonfrom datetime import datetime
def str_to_datetime(date_str: str) -> datetime:
"""
Convert a string representation of a date into a datetime object.
Args:
- date_str (str): String representation of a date in either
"YYYY年MM月DD日" or "YYYY/MM/DD" format.
Returns:
- datetime: A datetime object representing the date.
Raises:
- ValueError: If the date_str is not in one of the supported
formats or represents an invalid date.
"""
# Check for "YYYY年MM月DD日" format
if "年" in date_str and "月" in date_str and "日" in date_str:
return datetime.strptime(date_str, '%Y年%m月%d日')
# Check for "YYYY/MM/DD" format
elif "/" in date_str:
return datetime.strptime(date_str, '%Y/%m/%d')
else:
raise ValueError("Unsupported date format.")
このコードは、各行が79文字以下になるように調整されています。