Argument name should be lowercase

Thomas Passin list1 at tompassin.net
Fri Nov 11 09:09:51 EST 2022


This is a matter of convention.  Historically, many language 
practitioners got used to using all-caps for key constants.  This makes 
it easier to tell when you are using (or misusing) one, for one thing.

For myself, I also will use all-caps for quasi-constants, ones that are 
set only once, for example from command-line parameters.

In your example,I would not use all-caps for the formal parameter in the 
function  definition.  I would have written

def build_product_prices_dictionary(workbook_definitions:dict )->dict:
...
     price_array = xl.iget_array(
         file_name=workbook_definitions[ "file_name" ],

There is no value in making a formal parameter's name be all-caps, since 
even if it were the same string as an actual global parameter, it would 
not mean that actual parameter: it is only a placeholder.  There could 
even be a negative consequence, because later you might forget and think 
that the formal parameter's name meant that the global parameter would 
be used automatically in the function call, as if it were a default 
parameter.  At a minimum, this could lead to confusion about your 
intent, at a maximum it could end up being a bug.

Perhaps you wrote it that way as a reminder which dict to use.  If so, 
that kind of information would better go into the docstring:

def build_product_prices_dictionary(workbook_definitions:dict) -> dict:
     """Return a dictionary of product prices given their definitions.

     ARGUMENT
     workbook_definitions -- a dict of product definitions, typically
                             the global WORKBOOK_DEFINITIONS.
     """
     # ...

Alternatively, you could make the global be the default for the argument:

def build_product_prices_dictionary(workbook_definitions:dict =
                                     WORKBOOK_DEFINITIONS)->dict:

This might or might not make sense depending on how you plan to use the 
function.

So basically, PyCharm is suggesting that you use a clearer, less 
problem-prone style of naming.  I'd heed the advice.  It would also be 
in line with what many other programmers are used to reading, and that's 
a positive advantage.

On 11/11/2022 3:54 AM, dn wrote:
> PyCharm is warning against using an identifier of all upper-case letters 
> as a function's parameter, saying "Argument name should be lowercase". 
> (weak, code smell)
> 
> 
> The application consists of three+ files:
> - configuration
> - mainline script
> - module of workbook functions
> 
> The mainline reads the configuration parameters to set the application's 
> environment. All of the config/settings are constants. Some of them 
> appear as a dictionary (PRICES_WORKBOOK) defining a workbook's 
> (spreadsheet's) parameters, eg the filename, which work-sheet to use, etc.
> 
> 
> The mainline calls the relevant functions from within the module, 
> as-needed:-
> 
> import prices_workbook as pw
> ...
> product_prices = pw.build_product_prices_dictionary( PRICES_WORKBOOK )
> 
> 
> The module's function definition is:
> 
> def build_product_prices_dictionary( WORKBOOK_DEFINITIONS:dict )->dict:
> ...
>      price_array = xl.iget_array(
>          file_name=WORKBOOK_DEFINITIONS[ "file_name" ],
>          ...
> 
> (the function def is flagged, as above)
> 
> 
> A quick scan of PEP-008 failed to yield anything relevant. Why is this 
> frowned upon as poor Python, or a matter of style?
> 
> Yes, a dict is mutable, but the upper-case denoting a constant indicates 
> that none of its values are to be changed by the programmer.
> 
> As far as the function is concerned, the dict and its contents are 
> constants.
> (but the dict can't be treated as a global ENV[IRONMENT] object, because 
> it has to cross into the module's namespace)
> 
> 
> Is passing the dict as an argument/parameter considered to be 
> incompatible with its designation as a constant?
> 
> Perhaps the style should be more enum-like, ie the dict's name in 
> lower-case, with the key-named in upper case, eg
> 
>      workbook_definitions[ "FILE_NAME" ]
> 
> 
> Am not particularly concerned by the IDE raising this as a 'problem' - 
> will quite happily ignore and carry-on; but am curious as to the logic 
> behind the analysis - and why it doesn't come readily to mind.
> 
> Advice, comments, critique welcome!
> 



More information about the Python-list mailing list