在阅读TensorFlow中Slim库里Inception网络的代码时,发现有用单下划线命名的变量,来接收函数返回值,而且之后也没有用到。当时就猜测是不是意为不用的变量。代码如下:
def testEvaluation(self):
batch_size = 2
height, width = 224, 224
num_classes = 1000
eval_inputs = tf.random_uniform((batch_size, height, width, 3))
logits, _ = inception.inception_v2(eval_inputs, num_classes,
is_training=False)
predictions = tf.argmax(logits, 1)
with self.test_session() as sess:
sess.run(tf.global_variables_initializer())
output = sess.run(predictions)
self.assertEquals(output.shape, (batch_size,))
第七行中,该函数有两个返回值,第一个是网络的权重参数,第二个是查询字典,可以获得网络中所有张量名称,如MaxPool_2a_3x3
, Conv2d_2b_1x1
, Conv2d_2c_3x3
等。
此处由于是测试Evaluation,因此不需要获取网络内部张量的输出,故endpoint弃而不用,以”_”命名。
上网查询后,在StackOverflow找到了关于命名为”_”的变量的详细解释:
在交互式命令行中,使用命名为”_”的变量来保存上一次运行或上一条语句的结果
考虑到程序的国际化翻译,对某位置的文本获取时需要调用如
gettext()
等函数,来把英文转化为其他语言。为了不影响阅读,同时避免通篇的gettext()
调用,可以在开头将gettext()
函数赋值给_
,随后便可用_
来代替,提升阅读体验。例:raise forms.ValidationError(_("Please enter a correct username"))
最后一种便是上文提到的,用
_
变量存储不需要的返回值。如果使用字母命名,读者可能会认为这是个有意义的变量,而去上下文继续查找该变量是否有使用。
需要注意的是,上述的后两种用法会有冲突,因此需要避免在需要国际化的程序中使用_
代表忽略的变量。你也可以选择在需要国际化的程序中,也可改为使用两条下划线_
来代表忽略的变量。