On 2020-04-18 01:32, Dominik Vilsmeier wrote:
On 17.04.20 10:53, Steven D'Aprano wrote:

I think that, as little as I like the original proposal and am not
really convinced it is necessary, I think that it is better to have the
explicit token (the key/parameter name) on the left, and the implicit
token (blank) on the right:

     key=

I suspect it may be because we read left-to-right in English and Python,
so having the implicit blank come first is mentally like running into a
pothole at high speed :-)

For function calls, I think it is much easier to infer the parameter
name than the argument name. That's because usually functions are meant
to generalize, so their parameter names denote a more general concept.
Variable names on the other hand refer to some specific data that's used
throughout the program. For example imagine the function

      def call(*, phone_number, ...)  # here '...' means any number of
additional parameters

Then in the code we might have the following variables:

      phone_number_jane = '123'
      phone_number_john = '456'

Using any of these variables to invoke the `call` function, it is pretty
obvious which parameter it should be assigned to (for the human reader
at least, not the compiler):

      call(=phone_number_jane)

If on the other hand the parameter was specified it would be ambiguous
which variable to use:

      call(phone_number=)  # should we call Jane or John?

Now this doesn't relate to the original proposal yet, but imagine this
is inside some other function and we happen to have another variable
`phone_number` around:

      def create_conference_call_with_jane_and_john(phone_number):
          """`phone_number` will be placed in a conference call with Jane
and John."""

          phone_number_jane = '123'
          phone_number_john = '456'

          call(phone_number=)  # Whom do we call here?

Yes, there is a variable `phone_number` around but why use this
specifically? `phone_number_jane` and `phone_number_john` are also phone
numbers and `call` only asks for a phone number in general, so it's
ambiguous which one to use.

If on the other hand I read `call(=phone_number)` then I know
`phone_number` is a phone number and `call` expects one for its
`phone_number` parameter so it's pretty clear how the assignment should
be made.

Another example:

      purchases = load_data('purchases.txt')
      sales = load_data('sales.txt')
      data = load_data('user_data.txt')

      process(data=)  # We have multiple data sets available, so in the
face of ambiguity, ...
                                 # ... refuse the temptation to guess.

Functions parameters usually represent a concept and arguments then
represent the specific data. Often (not always) specific data can be
assigned a concept but the other way round is almost always ambiguous.

I disagree. The rule is very simple: use the variable with the matching name.

You can have only a name before the '=', but normally you can have an expression of arbitrary complexity after it.

IMHO, it's simpler to omit the RHS than to omit the LHS whilst also restricting it to a name.
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/U66SUUOKOOKSBCRC4TXSZVIUI4IQIR45/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to