@@ -232,8 +232,7 @@ def __init__(self, **kwargs):
232232 display_name = '<internal>' , ** kwargs )
233233
234234
235- @modifiers .kwoargs (start = 'name' )
236- def value_converter (func = None , name = None , convert_default = False ):
235+ def value_converter (func = None , * , name = None , convert_default = None , convert_default_filter = lambda s : isinstance (s , str )):
237236 """Callables decorated with this can be used as a value converter.
238237
239238 :param str name: Use this name to designate the parameter value type.
@@ -244,18 +243,31 @@ def value_converter(func=None, name=None, convert_default=False):
244243 The default is the name of the decorated function or type, modified to
245244 follow this rule.
246245
247- :param bool convert_default: If true, the value converter will be called
246+ :param bool convert_default: *Deprecated*: use the `Parameter.cli_default()` annotation instead.
247+
248+ If true, the value converter will be called
248249 with the default parameter value if none was supplied. Otherwise, the
249250 default parameter is used as-is.
250251
251252 Make sure to handle `None` appropriately if you override this.
252253
254+ :param function convert_convert_default_filter: *Deprecated* Avoid ``convert_default`` completely.
255+
256+ If ``convert_default`` is true, controls when the converter is called.
257+ The converter is used only if the given function returns true.
258+
253259 See :ref:`value converter`.
254260 """
261+ if convert_default is not None :
262+ warnings .warn ("The convert_default parameter of value_converter is deprecated. "
263+ "Direct users to use clize.Parameter.cli_default() instead." ,
264+ DeprecationWarning ,
265+ stacklevel = 2 )
255266 def decorate (func ):
256267 info = {
257268 'name' : util .name_type2cli (func ) if name is None else name ,
258269 'convert_default' : convert_default ,
270+ 'convert_default_filter' : convert_default_filter ,
259271 }
260272 try :
261273 func ._clize__value_converter = info
@@ -390,19 +402,30 @@ def help_parens(self):
390402
391403 def post_parse (self , ba ):
392404 super (ParameterWithValue , self ).post_parse (ba )
393- try :
394- info = self .conv ._clize__value_converter
395- except AttributeError :
396- pass
397- else :
398- if self in ba .not_provided :
399- if self .cli_default is not util .UNSET :
400- self .set_value (
401- ba ,
402- self .cli_default .value_after_conversion (partial (self .coerce_value , ba = ba ))
403- )
404- elif self .default is not util .UNSET and info ['convert_default' ]:
405- self .set_value (ba , self .coerce_value (self .default , ba ))
405+ if self in ba .not_provided :
406+ default_value = self .default_value_if_non_source_default (ba )
407+ if default_value is not util .UNSET :
408+ self .set_value (ba , default_value )
409+
410+ def default_value_if_non_source_default (self , ba ):
411+ if self .cli_default is not util .UNSET :
412+ return self .cli_default .value_after_conversion (partial (self .coerce_value , ba = ba ))
413+ if self .default is not util .UNSET :
414+ try :
415+ info = self .conv ._clize__value_converter
416+ except AttributeError :
417+ pass
418+ else :
419+ if info ['convert_default' ] and info ['convert_default_filter' ](self .default ):
420+ return self .conv (self .default )
421+ return util .UNSET
422+
423+ def default_value (self , ba ):
424+ converted_default = self .default_value_if_non_source_default (ba )
425+ if converted_default is not util .UNSET :
426+ return converted_default
427+ return self .default
428+
406429
407430
408431class NamedParameter (Parameter ):
@@ -617,10 +640,10 @@ def set_value(self, ba, val):
617640 return
618641 else :
619642 if arg is util .UNSET :
620- if param . cli_default != util . UNSET :
621- ba . args . append ( param . cli_default . value_after_conversion ( partial ( self . coerce_value , ba = ba )))
622- elif param . default != util . UNSET :
623- ba .args .append (param .default )
643+ default_value = param . default_value ( ba )
644+ if default_value is not util . UNSET :
645+ ba . args . append ( default_value )
646+ # ba.args.append(param.cli_default.value_after_conversion(partial(self.coerce_value, ba=ba)) )
624647 else :
625648 raise ValueError (
626649 "Can't set parameters after required parameters" )
@@ -967,6 +990,24 @@ def _use_class(pos_cls, varargs_cls, named_cls, varkwargs_cls, kwargs,
967990 "with clize.parser.value_converter()"
968991 )
969992
993+ if kwargs ['default' ] is not util .UNSET :
994+ try :
995+ info = getattr (kwargs ['conv' ], "_clize__value_converter" )
996+ except AttributeError :
997+ pass
998+ else :
999+ if info ["convert_default" ] and info ["convert_default_filter" ](kwargs ["default" ]):
1000+ warnings .warn (
1001+ f"For parameter '{ param .name } ': "
1002+ "Default argument conversion is deprecated. "
1003+ "Instead, please use clize.Parameter.cli_default(value) "
1004+ "when you need a default value that "
1005+ "is converted the same way as a value passed in from the command line, "
1006+ "as opposed to values passed in from calling the function in Python, "
1007+ "which aren't converted by Clize." ,
1008+ DeprecationWarning
1009+ )
1010+
9701011 if named :
9711012 kwargs ['aliases' ] = aliases
9721013 if param .kind == param .VAR_KEYWORD :
0 commit comments