1. 引言
在 Python 的学习与开发过程中,我们常常会遇到这样的困惑:面对一个陌生的库或模块,不知道它提供了哪些功能,也不知道某个函数该怎么用。其实,Python 早已为我们准备好了两件「法宝」------dir() 与 help()。它们就像一把万能钥匙和一本随身的说明书,能帮我们快速摸清任何包、模块或对象的底细。
本文将以 PyTorch 为例,带你直观感受这两大法宝的威力。
2. 什么是 Python 的两大法宝
我们可以把 Python 中的包(package)想象成一个大型仓库,仓库里划分了不同的区域,每个区域摆放着不同的工具。而 Python 语法为我们提供了两个探索这个仓库的利器:
dir():相当于「打开仓库大门」,让我们一眼看清里面有多少分区、多少工具。help():相当于「随身的说明书」,告诉我们某个工具具体该怎么使用。
简单来说,dir() 负责「看全貌」,help() 负责「查细节」。
3. 实战演示:以 PyTorch 为例
下面我们以深度学习框架 PyTorch 为例,实际体验一下这两大法宝的用法。
3.1 检查环境:CUDA 是否可用
在开始之前,我们通常需要确认当前环境是否支持 GPU 加速。这时可以这样写:
python
import torch
print(torch.cuda.is_available())
运行结果:
text
True
输出 True 表示当前环境可以使用 CUDA(GPU 加速)。
3.2 使用 help() 查看函数用法
如果我们想知道 torch.cuda.is_available 这个函数具体是做什么的、返回什么,直接用 help() 即可:
python
help(torch.cuda.is_available)
运行结果:
text
Help on function is_available in module torch.cuda:
is_available() -> bool
Returns a bool indicating if CUDA is currently available.
从帮助信息中我们可以清楚地看到:该函数返回一个布尔值(bool),用于指示 CUDA 当前是否可用。
3.3 使用 dir() 查看包内工具
如果我们想看看 torch 这个包里到底有哪些「区域」和「工具」,用 dir() 就能一览无余:
python
dir(torch)
运行结果(节选):
text
['AVG',
'AggregationType',
'AliasDb',
'AnyType',
'Argument',
'ArgumentSpec',
'BFloat16Storage',
'BFloat16Tensor',
'BenchmarkConfig',
...
'abs',
'abs_',
'absolute',
'acos',
'acos_',
'acosh',
'acosh_',
'adaptive_avg_pool1d',
'adaptive_max_pool1d',
'add',
'addbmm',
'addcdiv',
'addcmul',
'addmm',
'addmv',
'addr',
'affine_grid_generator',
'align_tensors',
'all',
'allclose',
'alpha_dropout',
'alpha_dropout_',
'amax',
'amin',
'aminmax',
'angle',
'any',
'ao',
'arange',
'arccos',
'arccos_',
'arccosh',
'arccosh_',
'arcsin',
'arcsin_',
'arcsinh',
'arcsinh_',
'arctan',
'arctan_',
'arctanh',
'arctanh_',
'are_deterministic_algorithms_enabled',
'argmax',
'argmin',
'argsort',
'as_strided',
'as_strided_',
'as_tensor',
'asin',
'asin_',
'asinh',
'asinh_',
'atan',
'atan_',
'atanh',
'atanh_',
'atleast_1d',
'atleast_2d',
'atleast_3d',
'attr',
'autocast',
'autocast_decrement_nesting',
'autocast_increment_nesting',
'autocast_mode',
'autograd',
'avg_pool1d',
'backends',
'baddbmm',
'bartlett_window',
'base_py_dll_path',
'batch_norm',
'batch_norm_backward_elemt',
'batch_norm_backward_reduce',
'batch_norm_elemt',
'batch_norm_gather_stats',
'batch_norm_gather_stats_with_counts',
'batch_norm_stats',
'batch_norm_update_stats',
'bernoulli',
'bfloat16',
'bilinear',
'binary_cross_entropy_with_logits',
'bincount',
'binomial',
'bitwise_and',
'bitwise_left_shift',
'bitwise_not',
'bitwise_or',
'bitwise_right_shift',
'bitwise_xor',
'blackman_window',
'block_diag',
'bmm',
'bool',
'broadcast_shapes',
'broadcast_tensors',
'broadcast_to',
'bucketize',
'can_cast',
'candidate',
'cartesian_prod',
'cat',
'cdist',
'cdouble',
'ceil',
'ceil_',
'celu',
'celu_',
'cfloat',
'chain_matmul',
'channel_shuffle',
'channels_last',
'channels_last_3d',
'cholesky',
'cholesky_inverse',
'cholesky_solve',
'choose_qparams_optimized',
'chunk',
'clamp',
'clamp_',
'clamp_max',
'clamp_max_',
'clamp_min',
'clamp_min_',
'classes',
'clear_autocast_cache',
'clip',
'clip_',
'clone',
'column_stack',
'combinations',
'compiled_with_cxx11_abi',
'complex',
'complex128',
'complex32',
'complex64',
'concat',
'conj',
'conj_physical',
'conj_physical_',
'constant_pad_nd',
'contiguous_format',
'conv1d',
'conv2d',
'conv3d',
'conv_tbc',
'conv_transpose1d',
'conv_transpose2d',
'conv_transpose3d',
'convolution',
'copysign',
'corrcoef',
'cos',
'cos_',
'cosh',
'cosh_',
'cosine_embedding_loss',
'cosine_similarity',
'count_nonzero',
'cov',
'cpp',
'cpu',
'cross',
'ctc_loss',
'ctypes',
'cuda',
'cuda_path',
'cuda_version',
'cudnn_affine_grid_generator',
'cudnn_batch_norm',
'cudnn_convolution',
'cudnn_convolution_add_relu',
'cudnn_convolution_relu',
'cudnn_convolution_transpose',
'cudnn_grid_sampler',
'cudnn_is_acceptable',
'cummax',
'cummin',
'cumprod',
'cumsum',
'cumulative_trapezoid',
'default_generator',
'deg2rad',
'deg2rad_',
'dequantize',
'det',
'detach',
'detach_',
'device',
'diag',
'diag_embed',
'diagflat',
'diagonal',
'diff',
'digamma',
'dist',
'distributed',
'distributions',
'div',
'divide',
'dll',
'dll_path',
'dll_paths',
'dlls',
'dot',
'double',
'dropout',
'dropout_',
'dsmm',
'dsplit',
'dstack',
'dtype',
'e',
'eig',
'einsum',
'embedding',
'embedding_bag',
'embedding_renorm_',
'empty',
'empty_like',
'empty_quantized',
'empty_strided',
'enable_grad',
'eq',
'equal',
'erf',
'erf_',
'erfc',
'erfc_',
'erfinv',
'exp',
'exp2',
'exp2_',
'exp_',
'expm1',
'expm1_',
'eye',
'fake_quantize_per_channel_affine',
'fake_quantize_per_tensor_affine',
'fbgemm_linear_fp16_weight',
'fbgemm_linear_fp16_weight_fp32_activation',
'fbgemm_linear_int8_weight',
'fbgemm_linear_int8_weight_fp32_activation',
'fbgemm_linear_quantize_weight',
'fbgemm_pack_gemm_matrix_fp16',
'fbgemm_pack_quantized_matrix',
'feature_alpha_dropout',
'feature_alpha_dropout_',
'feature_dropout',
'feature_dropout_',
'fft',
'fill_',
'finfo',
'fix',
'fix_',
'flatten',
'flip',
'fliplr',
'flipud',
'float',
'float16',
'float32',
'float64',
'float_power',
'floor',
'floor_',
'floor_divide',
'fmax',
'fmin',
'fmod',
'fork',
'frac',
'frac_',
'frexp',
'frobenius_norm',
'from_dlpack',
'from_file',
'from_numpy',
'frombuffer',
'full',
'full_like',
'functional',
'fused_moving_avg_obs_fake_quant',
'futures',
'gather',
'gcd',
'gcd_',
'ge',
'geqrf',
'ger',
'get_autocast_cpu_dtype',
'get_autocast_gpu_dtype',
'get_default_dtype',
'get_device',
'get_file_path',
'get_num_interop_threads',
'get_num_threads',
'get_rng_state',
'glob',
'gradient',
'greater',
'greater_equal',
'grid_sampler',
'grid_sampler_2d',
'grid_sampler_3d',
'group_norm',
'gru',
'gru_cell',
'gt',
'half',
'hamming_window',
'hann_window',
'hardshrink',
'has_cuda',
'has_cudnn',
'has_lapack',
'has_mkl',
'has_mkldnn',
'has_mlc',
'has_openmp',
'has_spectral',
'heaviside',
'hinge_embedding_loss',
'histc',
'histogram',
'hsmm',
'hsplit',
'hspmm',
'hstack',
'hub',
'hypot',
'i0',
'i0_',
'igamma',
'igammac',
'iinfo',
'imag',
'import_ir_module',
'import_ir_module_from_buffer',
'index_add',
'index_copy',
'index_fill',
'index_put',
'index_put_',
'index_select',
'inf',
'inference_mode',
'init_num_threads',
'initial_seed',
'inner',
'instance_norm',
'int',
'int16',
'int32',
'int64',
'int8',
'int_repr',
'inverse',
'is_anomaly_enabled',
'is_autocast_cache_enabled',
'is_autocast_cpu_enabled',
'is_autocast_enabled',
'is_complex',
'is_conj',
'is_distributed',
'is_floating_point',
'is_grad_enabled',
'is_inference',
'is_inference_mode_enabled',
'is_loaded',
'is_neg',
'is_nonzero',
'is_same_size',
'is_signed',
'is_storage',
'is_tensor',
'is_vulkan_available',
'is_warn_always_enabled',
'isclose',
'isfinite',
'isin',
'isinf',
'isnan',
'isneginf',
'isposinf',
'isreal',
'istft',
'jit',
'kaiser_window',
'kernel32',
'kl_div',
'kron',
'kthvalue',
'last_error',
'layer_norm',
'layout',
'lcm',
'lcm_',
'ldexp',
'ldexp_',
'le',
'legacy_contiguous_format',
'lerp',
'less',
'less_equal',
'lgamma',
'linalg',
'linspace',
'load',
'lobpcg',
'log',
'log10',
'log10_',
'log1p',
'log1p_',
'log2',
'log2_',
'log_',
'log_softmax',
'logaddexp',
'logaddexp2',
'logcumsumexp',
'logdet',
'logical_and',
'logical_not',
'logical_or',
'logical_xor',
'logit',
'logit_',
'logspace',
'long',
'lstm',
'lstm_cell',
'lstsq',
'lt',
'lu',
'lu_solve',
'lu_unpack',
'manual_seed',
'margin_ranking_loss',
'masked_fill',
'masked_scatter',
'masked_select',
'matmul',
'matrix_exp',
'matrix_power',
'matrix_rank',
'max',
'max_pool1d',
'max_pool1d_with_indices',
'max_pool2d',
'max_pool3d',
'maximum',
'mean',
'median',
'memory_format',
'merge_type_from_type_comment',
'meshgrid',
'min',
'minimum',
'miopen_batch_norm',
'miopen_convolution',
'miopen_convolution_transpose',
'miopen_depthwise_convolution',
'miopen_rnn',
'mkldnn_adaptive_avg_pool2d',
'mkldnn_convolution',
'mkldnn_convolution_backward_weights',
'mkldnn_linear_backward_weights',
'mkldnn_max_pool2d',
'mkldnn_max_pool3d',
'mm',
'mode',
'moveaxis',
'movedim',
'msort',
'mul',
'multinomial',
'multiply',
'multiprocessing',
'mv',
'mvlgamma',
'name',
'nan',
'nan_to_num',
'nan_to_num_',
'nanmean',
'nanmedian',
'nanquantile',
'nansum',
'narrow',
'narrow_copy',
'native_batch_norm',
'native_group_norm',
'native_layer_norm',
'native_norm',
'ne',
'neg',
'neg_',
'negative',
'negative_',
'nextafter',
'nn',
'no_grad',
'nonzero',
'norm',
'norm_except_dim',
'normal',
'not_equal',
'nuclear_norm',
'numel',
'nvtoolsext_dll_path',
'ones',
'ones_like',
'onnx',
'ops',
'optim',
'orgqr',
'ormqr',
'os',
'outer',
'overrides',
'package',
'pairwise_distance',
'parse_ir',
'parse_schema',
'parse_type_comment',
'path_patched',
'pca_lowrank',
'pdist',
'per_channel_affine',
'per_channel_affine_float_qparams',
'per_channel_symmetric',
'per_tensor_affine',
'per_tensor_symmetric',
'permute',
'pfiles_path',
'pi',
'pinverse',
'pixel_shuffle',
'pixel_unshuffle',
'platform',
'poisson',
'poisson_nll_loss',
'polar',
'polygamma',
'positive',
'pow',
'prelu',
'prepare_multiprocessing_environment',
'preserve_format',
'prev_error_mode',
'prod',
'profiler',
'promote_types',
'put',
'py_dll_path',
'q_per_channel_axis',
'q_per_channel_scales',
'q_per_channel_zero_points',
'q_scale',
'q_zero_point',
'qint32',
'qint8',
'qr',
'qscheme',
'quantile',
'quantization',
'quantize_per_channel',
'quantize_per_tensor',
'quantized_batch_norm',
'quantized_gru',
'quantized_gru_cell',
'quantized_lstm',
'quantized_lstm_cell',
'quantized_max_pool1d',
'quantized_max_pool2d',
'quantized_rnn_relu_cell',
'quantized_rnn_tanh_cell',
'quasirandom',
'quint4x2',
'quint8',
'rad2deg',
'rad2deg_',
'rand',
'rand_like',
'randint',
'randint_like',
'randn',
'randn_like',
'random',
'randperm',
'range',
'ravel',
'read_vitals',
'real',
'reciprocal',
'reciprocal_',
'relu',
'relu_',
'remainder',
'renorm',
'repeat_interleave',
'res',
'reshape',
'resize_as_',
'resize_as_sparse_',
'resolve_conj',
'resolve_neg',
'result_type',
'rnn_relu',
'rnn_relu_cell',
'rnn_tanh',
'rnn_tanh_cell',
'roll',
'rot90',
'round',
'round_',
'row_stack',
'rrelu',
'rrelu_',
'rsqrt',
'rsqrt_',
...]
可以看到,dir(torch) 返回了一个长长的列表,里面包含了 torch 包中所有可用的属性、函数和子模块名称。虽然内容很多,但通过它我们能快速了解这个包的整体结构。
4. 两大法宝的适用场景
- 探索新库 :拿到一个陌生的库,先用
dir()看它有哪些模块和函数,再用help()逐个了解关键函数的用法。 - 快速回忆 :写代码时忘了某个函数的参数,用
help()立刻查看文档。 - 检查环境 :结合
dir()和help(),可以快速确认某个功能在当前环境中是否可用(例如torch.cuda.is_available())。
5. 总结
dir() 与 help() 是 Python 中最基础也最实用的两个内置函数。它们不需要额外安装,却能极大提升我们探索代码的效率。无论是初学者还是资深开发者,掌握这两大法宝都能让开发过程事半功倍。
下次遇到陌生的库时,不妨先 dir() 一下,再 help() 一下,你会发现 Python 的世界其实并不神秘。