Why do some functions have underscores __ before and after the function name?
From the Python PEP 8 -- Style Guide for Python Code:
Descriptive: Naming Styles
The following special forms using leading or trailing underscores are
recognized (these can generally be combined with any case convention):
_single_leading_underscore
: weak "internal use" indicator. E.g.from M import *
does not import objects whose name starts with an underscore.
single_trailing_underscore_
: used by convention to avoid conflicts with Python keyword, e.g.
Tkinter.Toplevel(master, class_='ClassName')
__double_leading_underscore
: when naming a class attribute, invokes name mangling (inside class FooBar,__boo
becomes_FooBar__boo
; see below).
__double_leading_and_trailing_underscore__
: "magic" objects or attributes that live in user-controlled namespaces. E.g.__init__
,
__import__
or__file__
. Never invent such names; only use them as documented.
Note that names with double leading and trailing underscores are essentially reserved for Python itself: "Never invent such names; only use them as documented".
Why do some functions in C have an underscore prefix?
The underscore prefix is reserved for functions and types used by the compiler and standard library. The standard library can use these names freely because they will never conflict with correct user programs.
The other side to this is that you are not allowed to define names that begin with an underscore.
Well, that is the gist of the rule. The actual rule is this:
You cannot define any identifiers in global scope whose names begin with an underscore, because these may conflict with hidden (private) library definitions. So this is invalid in your code:
#ifndef _my_header_h_
#define _my_header_h_ // wrong
int _x; // wrong
float _my_function(void); // wrong
#endifBut this is valid:
#ifndef my_header_h
#define my_header_h // ok
int x; // ok
float my_function(void) { // ok
int _x = 3; // ok in function
}
struct my_struct {
int _x; // ok inside structure
};
#endifYou cannot define any identifiers in any scope whose names begin with two underscores, or one underscore followed by a capital letter. So this is invalid:
struct my_struct {
int _Field; // Wrong!
int __field; // Wrong!
};
void my_function(void) {
int _X; // Wrong!
int __y; // Wrong!
}But this is okay:
struct my_struct {
int _field; // okay
};
void my_function(void) {
int _x; // okay
}
There are actually a few more rules, just to make things complicated, but the ones above are the most often violated and the easiest to remember.
What is the meaning of single and double underscore before an object name?
Single Underscore
In a class, names with a leading underscore indicate to other programmers that the attribute or method is intended to be be used inside that class. However, privacy is not enforced in any way.
Using leading underscores for functions in a module indicates it should not be imported from somewhere else.
From the PEP-8 style guide:
_single_leading_underscore
: weak "internal use" indicator. E.g.from M import *
does not import objects whose name starts with an underscore.
Double Underscore (Name Mangling)
From the Python docs:
Any identifier of the form
__spam
(at least two leading underscores, at most one trailing underscore) is textually replaced with_classname__spam
, whereclassname
is the current class name with leading underscore(s) stripped. This mangling is done without regard to the syntactic position of the identifier, so it can be used to define class-private instance and class variables, methods, variables stored in globals, and even variables stored in instances. private to this class on instances of other classes.
And a warning from the same page:
Name mangling is intended to give classes an easy way to define “private” instance variables and methods, without having to worry about instance variables defined by derived classes, or mucking with instance variables by code outside the class. Note that the mangling rules are designed mostly to avoid accidents; it still is possible for a determined soul to access or modify a variable that is considered private.
Example
>>> class MyClass():
... def __init__(self):
... self.__superprivate = "Hello"
... self._semiprivate = ", world!"
...
>>> mc = MyClass()
>>> print mc.__superprivate
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: myClass instance has no attribute '__superprivate'
>>> print mc._semiprivate
, world!
>>> print mc.__dict__
{'_MyClass__superprivate': 'Hello', '_semiprivate': ', world!'}
Why are some methods with __ in front of them not private?
A double leading underscore does not actually make a method private. A single leading underscore hints that the method should be for internal use only, but is not enforced by python.
__init__
has a double leading and trailing underscore which means that it is a magic method that is reserved for special use by python. You should never name a method with double leading and trailing underscores.
Why do people use __ (double underscore) so much in C++
From Programming in C++, Rules and Recommendations :
The use of two underscores (`__') in identifiers is reserved for the compiler's internal use according to the ANSI-C standard.
Underscores (`_') are often used in names of library functions (such as "_main" and "_exit"). In order to avoid collisions, do not begin an identifier with an underscore.
What is the underscore _ in JavaScript?
This is convention of private methods and variables. In JavaScript there is no real privacy of classes.
It means that you should not use these method (starting with "_
") out of your object. Of course technically you can, but "_
" means that you should not.
Can we name python functions (not methods!) with leading underscores?
Credit goes to @CoryKramer for pointing out the relevant section
In addition, the following special forms using leading or trailing underscores are recognized [...]:
- _single_leading_underscore: weak "internal use" indicator. E.g. from M import * does not import objects whose names start with an underscore.
Why do I need underscores in swift?
There are a few nuances to different use cases, but generally an underscore means "ignore this".
When declaring a new function, an underscore tells Swift that the parameter should have no label when called — that's the case you're seeing. A fuller function declaration looks like this:
func myFunc(label name: Int) // call it like myFunc(label: 3)
"label" is an argument label, and must be present when you call the function. (And since Swift 3, labels are required for all arguments by default.) "name" is the variable name for that argument that you use inside the function. A shorter form looks like this:
func myFunc(name: Int) // call it like myFunc(name: 3)
This is a shortcut that lets you use the same word for both external argument label and internal parameter name. It's equivalent to func myFunc(name name: Int)
.
If you want your function to be callable without parameter labels, you use the underscore _
to make the label be nothing/ignored. (In that case you have to provide an internal name if you want to be able to use the parameter.)
func myFunc(_ name: Int) // call it like myFunc(3)
In an assignment statement, an underscore means "don't assign to anything". You can use this if you want to call a function that returns a result but don't care about the returned value.
_ = someFunction()
Or, like in the article you linked to, to ignore one element of a returned tuple:
let (x, _) = someFunctionThatReturnsXandY()
When you write a closure that implements some defined function type, you can use the underscore to ignore certain parameters.
PHPhotoLibrary.performChanges( { /* some changes */ },
completionHandler: { success, _ in // don't care about error
if success { print("yay") }
})
Similarly, when declaring a function that adopts a protocol or overrides a superclass method, you can use _
for parameter names to ignore parameters. Since the protocol/superclass might also define that the parameter has no label, you can even end up with two underscores in a row.
class MyView: NSView {
override func mouseDown(with _: NSEvent) {
// don't care about event, do same thing for every mouse down
}
override func draw(_ _: NSRect) {
// don't care about dirty rect, always redraw the whole view
}
}
Somewhat related to the last two styles: when using a flow control construct that binds a local variable/constant, you can use _
to ignore it. For example, if you want to iterate a sequence without needing access to its members:
for _ in 1...20 { // or 0..<20
// do something 20 times
}
If you're binding tuple cases in a switch statement, the underscore can work as a wildcard, as in this example (shortened from one in The Swift Programming Language):
switch somePoint { // somePoint is an (Int, Int) tuple
case (0, 0):
print("(0, 0) is at the origin")
case (_, 0):
print("(\(somePoint.0), 0) is on the x-axis")
case (0, _):
print("(0, \(somePoint.1)) is on the y-axis")
default:
print("(\(somePoint.0), \(somePoint.1)) isn't on an axis")
}
One last thing that's not quite related, but which I'll include since (as noted by comments) it seems to lead people here: An underscore in an identifier — e.g. var _foo
, func do_the_thing()
, struct Stuff_
— means nothing in particular to Swift, but has a few uses among programmers.
Underscores within a name are a style choice, but not preferred in the Swift community, which has strong conventions about using UpperCamelCase for types and lowerCamelCase for all other symbols.
Prefixing or suffixing a symbol name with underscore is a style convention, historically used to distinguish private/internal-use-only symbols from exported API. However, Swift has access modifiers for that, so this convention generally is seen as non-idiomatic in Swift.
A few symbols with double-underscore prefixes (func __foo()
) lurk in the depths of Apple's SDKs: These are (Obj)C symbols imported into Swift using the NS_REFINED_FOR_SWIFT
attribute. Apple uses that when they want to make a "more Swifty" version of an (Obj)C API — for example, to make a type-agnostic method into a generic method. They need to use the imported API to make the refined Swift version work, so they use the __
to keep it available while hiding it from most tools and documentation.
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:def callback(_):
return True[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.]
This use case can conflict with the translation lookup use case, so it is necessary to avoid using
_
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.
What does an underscore before a function denote?
Typically it's a marker for indicating that a function is to be considered 'private'. Private can mean a few different things depending on context, such as:
- This function should not be called outside of the file.
- This method of the class should only be called by other methods of this class.
It also typically means that as a user of the library, you should not rely on these methods to not change between minor versions. They are not a public API.
Furthermore, some tooling will pick up on the underscore and not consider it when for example automatically generating documentation.
This is 100% convention, so nothing prevents you from actually using this.
Related Topics
When I Catch an Exception, How to Get the Type, File, and Line Number
Libxml Install Error Using Pip
How to Print Bold Text in Python
How to Determine the Language of a Piece of Text
Cannot Install Lxml on MAC Os X 10.9
Running Python on Windows for Node.Js Dependencies
Usage of Sys.Stdout.Flush() Method
Change User-Agent for Selenium Web-Driver
How to Find Numeric Columns in Pandas
Check If Two Unordered Lists Are Equal
Date Ticks and Rotation in Matplotlib
Writing a Dictionary to a CSV File with One Line for Every 'Key: Value'
Unpacking a List/Tuple of Pairs into Two Lists/Tuples
Seeing Escape Characters When Pressing the Arrow Keys in Python Shell