Meaning of using commas and underscores with Python assignment operator?
d2, = values[s]
is just like a,b=f()
, except for unpacking 1 element tuples.
>>> T=(1,)
>>> a=T
>>> a
(1,)
>>> b,=T
>>> b
1
>>>
a
is tuple, b
is an integer. What is the purpose of the single underscore _ variable in Python?
_
has 3 main conventional uses in Python:
To hold the result of the last executed expression in an interactive
interpreter session (see docs). This precedent was set by the standard CPython
interpreter, and other interpreters have followed suitFor translation lookup in i18n (see the
gettext
documentation for example), as in code likeraise forms.ValidationError(_("Please enter a correct username"))
As a general purpose "throwaway" variable name:
To indicate that part
of a function result is being deliberately ignored (Conceptually, it is being discarded.), as in code like:label, has_label, _ = text.partition(':')
As part of a function definition (using either
def
orlambda
), where
the signature is fixed (e.g. by a callback or parent class API), but
this particular function implementation doesn't need all of the
parameters, as in code like:
[For a long time this answer didn't list this use case, but it came up often enough, as noted here, to be worth listing explicitly.]def callback(_):
return True
_
as a throwaway variable in any code block that also uses it for i18n translation (many folks prefer a double-underscore,__
, as their throwaway variable for exactly this reason).Linters often recognize this use case. For example
year, month, day = date()
will raise a lint warning ifday
is not used later in the code. The fix, ifday
is truly not needed, is to writeyear, month, _ = date()
. Same with lambda functions,lambda arg: 1.0
creates a function requiring one argument but not using it, which will be caught by lint. The fix is to writelambda _: 1.0
. An unused variable is often hiding a bug/typo (e.g. setday
but usedya
in the next line).The pattern matching feature added in Python 3.10 elevated this usage from "convention" to "language syntax" where
match
statements are concerned: in match cases,_
is a wildcard pattern, and the runtime doesn't even bind a value to the symbol in that case.For other use cases, remember that
_
is still a valid variable name, and hence will still keep objects alive. In cases where this is undesirable (e.g. to release memory or external resources) an explicitdel name
call will both satisfy linters that the name is being used, and promptly clear the reference to the object.
Meaning of using commas and underscores with Python assignment operator?
d2, = values[s]
is just like a,b=f()
, except for unpacking 1 element tuples.
>>> T=(1,)
>>> a=T
>>> a
(1,)
>>> b,=T
>>> b
1
>>>
a
is tuple, b
is an integer. What does the comma after the target name in this assignment statement do?
It is needed to unpack the 1-tuple (or any other length-1 sequence). Example:
>>> a,b = (1,2)
>>> print a
1
>>> print b
2
>>> c, = (3,)
>>> print c
3
>>> d = (4,)
>>> print d
(4,)
Notice the difference between c and d.Note that:
a, = (1,2)
fails because you need the same number of items on the left side as the iterable on the right contains. Python 3.x alleviates this somewhat:Python 3.2.3 (v3.2.3:3d0686d90f55, Apr 10 2012, 11:09:56)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a,*rest = (1,2,3)
>>> a
1
>>> rest
[2, 3]
What is _, (underscore comma) in a Go declaration?
It avoids having to declare all the variables for the returns values.
It is called the blank identifier.
As in:
_, y, _ := coord(p) // coord() returns three values; only interested in y coordinate
That way, you don't have to declare a variable you won't use: Go would not allow it. Instead, use '_' to ignore said variable.(the other '_
' use case is for import)
Since it discards the return value, it is helpful when you want to check only one of the returned values, as in "How to test key existence in a map?" shown in "Effective Go, map":
_, present := timeZone[tz]
To test for presence in the map without worrying about the actual value, you can use the blank identifier, a simple underscore (As Jsor adds in the comments:_
).
The blank identifier can be assigned or declared with any value of any type, with the value discarded harmlessly.
For testing presence in a map, use the blank identifier in place of the usual variable for the value.
"generally accepted standard" is to call the membership test variables "ok" (same for checking if a channel read was valid or not)That allows you to combine it with test:
if _, err := os.Stat(path); os.IsNotExist(err) {
fmt.Printf("%s does not exist\n", path)
}
You would find it also in loop:If you only need the second item in the range (the value), use the blank identifier, an underscore, to discard the first:
sum := 0
for _, value := range array {
sum += value
}
Related Topics
Pycharm Error: 'No Module' When Trying to Import Own Module (Python Script)
Filename and Line Number of Python Script
Setting Up S3 for Logs in Airflow
Why Use Sys.Path.Append(Path) Instead of Sys.Path.Insert(1, Path)
How to Check for Python Version in a Program That Uses New Language Features
How to Find the Maximum Value in a List of Tuples
When Should an Attribute Be Private and Made a Read-Only Property
How to Check Task Status in Celery
In-Place Type Conversion of a Numpy Array
Parallelize Apply After Pandas Groupby
How to Delete Created Variables, Functions, etc from the Memory of the Interpreter
Numpy Argsort - What Is It Doing
Pandas Number Rows Within Group in Increasing Order
Selecting Columns from Pandas Multiindex
Counting Cars Opencv + Python Issue
Download Image File from the HTML Page Source