回答編集履歴

1

修正

2021/09/01 08:37

投稿

nto
nto

スコア1438

test CHANGED
@@ -1,153 +1,9 @@
1
- save関数の中で最後に実行している`super().save(*args, **kwargs)`とありますが
2
-
3
- `*args, **kwargs`というのは可変長引数といって、関数を実行するときに与えるものではありません。
4
-
5
- 実行する関数で、引数を受け取る時に使用するものです。
6
-
7
- よって使用例としては以下の様な形式が正しいでしょう。
8
-
9
- ```python
10
-
11
- def sample(*args):
12
-
13
- print(type(args))
14
-
15
- print(args)
16
-
17
-
18
-
19
- sample('apple', 'bike', 'car', 'desk')
20
-
21
- >> <class 'tuple'>
22
-
23
- >> ('apple', 'bike', 'car', 'desk')
24
-
25
-
26
-
27
-
28
-
29
- def sample2(**kwargs):
30
-
31
- print(type(kwargs))
32
-
33
- print(kwargs)
34
-
35
-
36
-
37
- sample2(a=1, b=2, c=3, d=4)
38
-
39
- >> <class 'dict'>
40
-
41
- >> {'a': 1, 'b': 2, 'c': 3, 'd': 4}
42
-
43
-
44
-
45
- ```
46
-
47
- 引数についてはこちらが非常に参考になると思います。
48
-
49
- [https://atmarkit.itmedia.co.jp/ait/articles/1905/21/news009.html](https://atmarkit.itmedia.co.jp/ait/articles/1905/21/news009.html)
50
-
51
-
52
-
53
- ---
54
-
55
- 例えば
56
-
57
- save変数の中で定義されたクラス変数を、
58
-
59
- passorfail関数に引数として渡したい
60
-
61
- というのならば引数を何か設定する必要があります。
62
-
63
-
64
-
65
- 掲題のコードでは
66
-
67
- pasorfail変数の中でself.next_calibration_dateとtoday.monthを比較するという
68
-
69
- 構成の様ですが、この場合save関数内のクラス変数を使用しているわけではなく
70
-
71
- **self.next_calibration_date**と定義されたインスタンス変数を使用しているものである為
72
-
73
- あえて引数はわざわざ何も設定しなくても良いかもしれません。
74
-
75
-
76
-
77
- 例えばsave関数の中で、最後にpassorfail関数を実行したいという事であれば以下の様にする事で動作しないでしょうか。
78
-
79
-
80
-
81
- ```python
82
-
83
- # これを関数1とします。
84
-
85
- def save(self, *args, **kwargs):
86
-
87
- auto_now = kwargs.pop('next_calibration_date_auto_now', True)
88
-
89
- if auto_now:
90
-
91
- if self.calibration_type == CALIBRATION_CHOICES[0][0]:
92
-
93
- calibration_span = 1
94
-
95
- elif self.calibration_type == CALIBRATION_CHOICES[1][0]:
96
-
97
- calibration_span = 2
98
-
99
- elif self.calibration_type == CALIBRATION_CHOICES[2][0]:
100
-
101
- calibration_span = 5
102
-
103
- elif self.calibration_type == CALIBRATION_CHOICES[3][0]:
104
-
105
- calibration_span = 10
106
-
107
-
108
-
109
- self.next_calibration_date = self.calibration_date + relativedelta(years=calibration_span)
110
-
111
- # passorfail関数を実行
112
-
113
- self.passorfail()
114
-
115
-
116
-
117
-
118
-
119
- # これを関数2とします。
120
-
121
- def passorfail(self):
122
-
123
- today = datetime.today()
124
-
125
- # save関数内で定義されたインスタンス引数とtoday.monthを比較して条件分岐
126
-
127
- if self.next_calibration_date == (today.month):
128
-
129
- pass_result = ('校正対象')
130
-
131
- elif self.next_calibration_date > (today.month):
132
-
133
- pass_result = ('合格')
134
-
135
- else:
136
-
137
- pass_result = ('不合格')
138
-
139
-
140
-
141
- self.ins_result = pass_result
142
-
143
- ```
144
-
145
1
  passorfail関数内でself.next_calibration_dateがNoneTypeになっていた様ですが
146
2
 
147
3
  save関数を1とし、passorfail関数を2とするならば
148
4
 
5
+ passorfail関数をsave関数とリネームした事により
6
+
149
7
  1を実行しているつもりが2だけを実行していた為に
150
8
 
151
- self.next_calibration_dateが定義されていなかった事が原因でしょう。
9
+ self.next_calibration_dateが定義されていなかった事が原因の一つでしょう。
152
-
153
- ※あくまでおかしな点を挙げたものであり、上記コードに修正をしたから必ず動くというものではありません。