Что вы спрашиваете, почему это:
def func(a=[], b = 2):
pass
не является внутренне эквивалентным этому:
def func(a=None, b = None):
a_default = lambda: []
b_default = lambda: 2
def actual_func(a=None, b=None):
if a is None: a = a_default()
if b is None: b = b_default()
return actual_func
func = func()
, за исключением случая прямого вызова func (None , None), которые мы будем игнорировать.
Другими словами, вместо оценки параметров по умолчанию, почему бы не сохранить их каждый из них и оценить их при вызове функции?
Один ответ, вероятно, прямо там - он фактически превратит каждую функцию с параметрами по умолчанию в закрытие. Даже если это все скрыто в интерпретаторе, а не полномасштабное закрытие, данные должны быть где-то сохранены. Он будет медленнее и будет использовать больше памяти.
Да, если вы убедитесь, что git расширяет glob, а не вашу оболочку, то он будет соответствовать на любом уровне, поэтому что-то вроде этого (кавычки важны) должно работать нормально.
git diff -- '*.c' '*.h'
git diff
будет показывать только различия в неустановленных файлах.
Я нашел этот вопрос, потому что я хотел исключить файлы .info
из git diff
. Я достиг этого, выполнив его с помощью git add *.info
, что уменьшает оставшиеся файлы.
Чтобы включить рекурсивные файлы (включая текущий каталог), это сработало для меня:
git diff -- '***.py'
Аргумент командной строки для расширения.
git diff *.py
В качестве альтернативы вы можете передать find
в git diff
:
find . -name '*.py' -type f | git diff --
git diff *.py
и без кричащих заголовков
– sehe
18 December 2011 в 23:16
Либо используйте globstar вашей оболочки (который выполняет рекурсивный поиск) 1,2:
shopt -s globstar
git diff -- *.py **/*.py
, либо используйте find: find -name '*.py' -print0 | xargs -0 git diff --
Оба они являются специальными именами и пробелами. Хотя вы можете захотеть отфильтровать каталоги с расширением .py :) 1 Мне нравится делать git diff -- {.,**}/*.py
обычно 2 Когда globstar включен, git diff -- **/*.py
уже включает ./*.py
. В man-странице Bash: «Если за ним следует /, два соседних * s будут соответствовать только каталогам и подкаталогам». Для простых шаблонов файлов это работает:
$ git ls-files -zm '*.txt' | xargs --null git diff
Пробел безопасен, и вы также можете иметь несколько расширений:
$ git ls-files -zm '*.h|*.c|*.cpp' | xargs --null git diff
Я закончил с этим:
commit=<the_commit_hash_goes_here> && git diff --name-only $commit | grep -i Test | egrep -v '\.sql$' | xargs git diff $commit --
Это показывает diff для указанного коммита только в том случае, если имя файла содержит слово «тест» (нечувствительное к регистру) и не заканчивается на .sql
, изменять трубопровод, необходимый для вашего дела.
Ни один из приведенных выше ответов не работает для меня в git bash
для Windows. Я не уверен, что это версия (я использую 1.8.4) или Windows / bash; также, в моем случае, я хотел разделить две ветви, в которых у каждой ветви были дополнительные файлы, отсутствующие в другой ветке (таким образом, «находки» основаны на ошибках).
В любом случае это сработало для меня (в мой пример, поиск разницы между файлами python):
git diff branch1 branch2 -- `git diff --summary branch1 branch2 | egrep '\.py$' | cut -d ' ' -f 5`
git diff -- *.{c,h,etc}
– Matt Fletcher 25 November 2013 в 18:03git diff master HEAD -- "*filename.txt"
также полезноgit diff master HEAD --name-only
– neaumusic 2 March 2015 в 23:36