2
2
3
3
*/
4
4
5
- use crate :: function:: IntoPyNativeFunc ;
6
- use crate :: function:: OptionalArg ;
7
- use crate :: obj:: objstr:: PyStringRef ;
5
+ use crate :: function:: { IntoPyNativeFunc , OptionalArg , PyFuncArgs } ;
8
6
use crate :: obj:: objtype:: PyClassRef ;
9
7
use crate :: pyobject:: {
10
8
IdProtocol , PyClassImpl , PyContext , PyObject , PyObjectRef , PyRef , PyResult , PyValue ,
@@ -82,6 +80,7 @@ pub struct PyProperty {
82
80
getter : Option < PyObjectRef > ,
83
81
setter : Option < PyObjectRef > ,
84
82
deleter : Option < PyObjectRef > ,
83
+ doc : Option < PyObjectRef > ,
85
84
}
86
85
87
86
impl PyValue for PyProperty {
@@ -97,16 +96,31 @@ impl PyProperty {
97
96
#[ pymethod( name = "__new__" ) ]
98
97
fn new_property (
99
98
cls : PyClassRef ,
100
- fget : OptionalArg < PyObjectRef > ,
101
- fset : OptionalArg < PyObjectRef > ,
102
- fdel : OptionalArg < PyObjectRef > ,
103
- _doc : OptionalArg < PyStringRef > ,
99
+ args : PyFuncArgs ,
104
100
vm : & VirtualMachine ,
105
101
) -> PyResult < PyPropertyRef > {
102
+ arg_check ! (
103
+ vm,
104
+ args,
105
+ required = [ ] ,
106
+ optional = [ ( fget, None ) , ( fset, None ) , ( fdel, None ) , ( doc, None ) ]
107
+ ) ;
108
+
109
+ fn into_option ( vm : & VirtualMachine , arg : Option < & PyObjectRef > ) -> Option < PyObjectRef > {
110
+ arg. and_then ( |arg| {
111
+ if vm. ctx . none ( ) . is ( arg) {
112
+ None
113
+ } else {
114
+ Some ( arg. clone ( ) )
115
+ }
116
+ } )
117
+ }
118
+
106
119
PyProperty {
107
- getter : fget. into_option ( ) ,
108
- setter : fset. into_option ( ) ,
109
- deleter : fdel. into_option ( ) ,
120
+ getter : into_option ( vm, fget) ,
121
+ setter : into_option ( vm, fset) ,
122
+ deleter : into_option ( vm, fdel) ,
123
+ doc : into_option ( vm, doc) ,
110
124
}
111
125
. into_ref_with_type ( vm, cls)
112
126
}
@@ -187,6 +201,7 @@ impl PyProperty {
187
201
getter : getter. or_else ( || zelf. getter . clone ( ) ) ,
188
202
setter : zelf. setter . clone ( ) ,
189
203
deleter : zelf. deleter . clone ( ) ,
204
+ doc : None ,
190
205
}
191
206
. into_ref_with_type ( vm, TypeProtocol :: class ( & zelf) )
192
207
}
@@ -201,6 +216,7 @@ impl PyProperty {
201
216
getter : zelf. getter . clone ( ) ,
202
217
setter : setter. or_else ( || zelf. setter . clone ( ) ) ,
203
218
deleter : zelf. deleter . clone ( ) ,
219
+ doc : None ,
204
220
}
205
221
. into_ref_with_type ( vm, TypeProtocol :: class ( & zelf) )
206
222
}
@@ -215,6 +231,7 @@ impl PyProperty {
215
231
getter : zelf. getter . clone ( ) ,
216
232
setter : zelf. setter . clone ( ) ,
217
233
deleter : deleter. or_else ( || zelf. deleter . clone ( ) ) ,
234
+ doc : None ,
218
235
}
219
236
. into_ref_with_type ( vm, TypeProtocol :: class ( & zelf) )
220
237
}
@@ -259,6 +276,7 @@ impl<'a> PropertyBuilder<'a> {
259
276
getter : self . getter . clone ( ) ,
260
277
setter : self . setter . clone ( ) ,
261
278
deleter : None ,
279
+ doc : None ,
262
280
} ;
263
281
264
282
PyObject :: new ( payload, self . ctx . property_type ( ) , None )
0 commit comments